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 getRandomNum(int count, int digits, int sum) {
/** 结果集合 */
List resultList = new ArrayList();
/** 临时Integer集合 */
List tempList = new ArrayList();
/** 已生成的随机数和 */
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;
}
}
只能保证和相等,但是是结果不是很均匀,往往头重脚轻