double min = 0.0001;
double max = 10; // 总和
int cnt = 5; // 数量
int scl = 4; // 小数最大位数
int pow = (int) Math.pow(10, scl); // 用于提取指定小数位
double sum = 0; // 用于验证总和
double one ;
for (int i = 0; i < cnt; i ++) {
if ( i < cnt - 1 ) {
// min~max 指定小数位的随机数
one = Math.floor((Math.random() * (max - min) + min) * pow) / pow;
} else {
one = max;
}
max -= one;
sum += one;
// 输出
System.out.printf("%.4f\r\n", one);
}
// 验证
System.out.println(sum);
/*
演示输出:
6.7665
1.7457
0.0602
1.0894
0.3382
10.0
*/
Si vous souhaitez que l'écart entre les nombres aléatoires soit plus petit, vous pouvez modifier la formule de calcul d'un, par exemple en remplaçant max - min par max / (cnt - i). Bien sûr, il faut faire attention à la valeur de min pour éviter que celui-ci ne soit finalement un nombre négatif.
S'il s'agit de la question test du sujet, je pense que le point de test devrait être de prendre un nombre aléatoire entre le m~n spécifié. Pour le bien de ma réponse gênante, les frères de passage peuvent me donner un coup de pouce.
Si vous souhaitez que l'écart entre les nombres aléatoires soit plus petit, vous pouvez modifier la formule de calcul d'un, par exemple en remplaçant max - min par max / (cnt - i). Bien sûr, il faut faire attention à la valeur de min pour éviter que celui-ci ne soit finalement un nombre négatif.
S'il s'agit de la question test du sujet, je pense que le point de test devrait être de prendre un nombre aléatoire entre le m~n spécifié. Pour le bien de ma réponse gênante, les frères de passage peuvent me donner un coup de pouce.
Il ne peut garantir que la somme est égale, mais le résultat n'est pas très uniforme et est souvent très lourd