抢红包是钱数都是随机的,要写出完全是凭运气的代码才行
思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱
1,首先生成5个随机数,然后利用每个随机数在5个随机数中所占的比例分配钱数。
2,首先生成4个随机数,然后排序,将这4个随机数放在0~10块的坐标上,截取5段,这5段就是钱数。
当然,还得考虑一个问题,钱数是两位小数的,且最少的钱也是0.01;这就可能麻烦点了。
写的是第一种方法的代码,第二种以后再写,比较完整的抢红包也会在之后写,这之中还用到了double类型的加减法,需要BigDecimal类,在上一篇已经介绍:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class TestMoney {
public static void main(String[] args) {
int num = 999;
double money = 10;
List<Double> array = new ArrayList<>();
Random r = new Random();
double sum = 0;
for (int i = 0; i < num; i++) {
array.add(r.nextDouble()*money + 0.01 * num * money);//经过小小的计算,这样使最小的钱尽量接近0.01;num越大,此计算越没有用
sum += array.get(i);
}
for (int i = 0; i < array.size(); i++) {
array.set(i, array.get(i) / sum*money);
}
Collections.sort(array);
//double z=1.0*money;
for (int i = 0; i < array.size(); i++) {//将钱进行分配;
if(array.get(i)<=0.01){//不足0.01的直接给0.01;
//z-=0.01;
array.set(i, 0.01);
}
else if(i==array.size()-1){
//array.set(i, (int)(z*100)*1.0/100);//将剩余的一点money给最后一个人,因为排序,最后一个人最大份,所以最后分配的肯定是正数
BigDecimal he =new BigDecimal("0");
for(int j=0;j<array.size()-1;j++){
BigDecimal b =new BigDecimal(Double.toString(array.get(j)));
he=he.add(b);
}
BigDecimal moneyb =new BigDecimal(Double.toString(money));
array.set(i, moneyb.subtract(he).doubleValue());
}
else{
array.set(i, (int)(array.get(i)*100)*1.0/100);
//z-=array.get(i);
}
}
Collections.shuffle(array);
for(Double a:array){
System.out.println(a);
}
//System.out.println(array.contains(0.02));
}
}