怪我咯2017-04-18 09:35:12
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
*/
如果你想隨機數間的差距更小點,可以修改 one 的計算公式,如把 max - min 更換成 max / (cnt - i)。當然你還要注意 min 的值,避免最後算出 one 為負數。
如果這是題主的考試題,我想考點應該在取指定 m~n 之間的隨機數吧。看在我費勁答的份上,路過的兄弟們給個讚嗆。
黄舟2017-04-18 09:35:12
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by Jackie on 2016/7/20.
*/
public class RedEnvelopRandom {
private static final Random random = new Random();
/**
* 返回红包数集合
*
* @param count 红包个数
* @param digits 小数位数
* @param sum 红包金额总和
* @return 红包随机数集合
*/
public static List<Float> getRandomNum(int count, int digits, int sum) {
/** 结果集合 */
List<Float> resultList = new ArrayList<Float>();
/** 临时Integer集合 */
List<Integer> tempList = new ArrayList<Integer>();
/** 已生成的随机数和 */
int value = 0;
/** 记录每次生成的随机数 */
int tempRandom;
/** 先将和乘以10^digits,当整数处理 */
sum = sum * (int) Math.pow(10, digits);
//随机产生0-sum*digits之间的随机数,执行count-1
for (int i = 1; i < count; i++) {
//前面产生的随机数的和
value += tempList.size() == 0 ? 0 : tempList.get(i - 2);
//保证每次的随机数产生后,余下的值至少够分
tempRandom = random.nextInt(sum - count + i - value) + 1;
tempList.add(tempRandom);
}
//最后剩下的值,保证总和不变
value += tempList.size() == 0 ? 0 : tempList.get(count - 2);
tempList.add(sum - value);
//除以10*digits,得到小数
for (Integer temp :
tempList) {
resultList.add(new Float(temp) / (int) Math.pow(10, digits));
}
return resultList;
}
}
只能保證和相等,但是是結果不是很均勻,往往頭重腳輕