您的位置:首页 > 其它

红包平均分配算法

2015-06-24 15:14 309 查看
直接上代码

import java.util.Iterator;
import java.util.TreeSet;

public class Hongbao {
private final int[] moneyList;
private final int number;
private final int totalMoney;
private int cur;
public Hongbao(int number, int totalMoney) {
if (number > totalMoney)
throw new IllegalArgumentException("number <= totalMoney");
this.number = number;
this.totalMoney = totalMoney;
moneyList = new int[number + 1];
TreeSet<Integer> moneySet = new TreeSet<>();
initial(moneySet);
int i = -1;
Iterator<Integer> iter = moneySet.iterator();
while (iter.hasNext()) {
moneyList[++i] = iter.next();
}
cur = 0;
}
protected void initial(TreeSet<Integer> moneySet) {
moneySet.add(0);
moneySet.add(totalMoney);
for (int i = 1; i < number; ++i) {
int tempMoney = rand(totalMoney);
while (moneySet.contains(tempMoney)) {
++tempMoney;
tempMoney %= totalMoney;
}
moneySet.add(tempMoney);
}
}
protected int rand(int n) {
return (int)(Math.random() * (n - 1) + 1);
}
public int getOne() {
return moneyList[++cur] - moneyList[cur - 1];
}
}测试代码
public static void main(String[] args) {
int[] arr = new int[20];
for (int i = 0; i < 20; i++)
arr[i] = 0;
for (int j = 0; j < 4000; ++j) {
Hongbao h = new Hongbao(20, 1000);
for (int i = 0; i < 20; ++i)
arr[i] += h.getOne();
}
for (int i = 0; i < 20; i++)
System.out.println(arr[i]);
}我测试的结果
198741
198305
197537
195746
196592
198304
202119
198655
200099
200290
198616
205446
198713
200420
203392
199065
205758
200732
198460
203010
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: