抢红包是钱数都是随机的,要写出完全是凭运气抢红包的代码才行
思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱
1,首先生成5个随机数,然后利用每个随机数在5个随机数中所占的比例分配钱数。
2,首先生成4个随机数,然后排序,将这4个随机数放在0~10块的坐标上,截取5段,这5段就是钱数。
当然,还得考虑一个问题,钱数是两位小数的,且最少的钱也是0.01;这就可能麻烦点了。 写的是第一种方法的代码:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class LuckyBag {
private int sumnum=0;//已抢的红包数
private int num=0;//红包总数
private double maxLucky=0;//手气最佳的钱数
private String maxLuckyPerson="";//运气王
private long start;//发红包的开始时间
private long endtime=10000;//红包有效时间
private double money;//红包钱数
private List<Double> array = new ArrayList<>();//红包随机分配的list
public LuckyBag(int num,double money){
this.num=num;
this.money=money;
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());
maxLucky=Math.max(array.get(i),array.get(i-1));
}
else{
array.set(i, (int)(array.get(i)*100)*1.0/100);
//z-=array.get(i);
}
}
Collections.shuffle(array);
start=System.currentTimeMillis();
// for(Double a:array){
// System.out.println(a);
// }
// System.out.println(array.contains(0.02));
}
public void getBag(String name){
if(sumnum<num)
{
long time=System.currentTimeMillis();
if(time-start>=endtime){
System.out.println("红包已过期!");
return;
}
if(array.get(sumnum)==maxLucky){
maxLuckyPerson=name;
}
System.out.println(" "+name+"抢了"+array.get(sumnum)+"元");
sumnum++;
}
else{
System.out.println(" 红包已被抢完"+'\n'+" 运气王是"+maxLuckyPerson+" 抢了"+maxLucky+"元");
}
}
public static void main(String[] args) {
LuckyBag lb=new LuckyBag(5,10.0);
// lb.getBag("java");
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// lb.getBag("java2");
String [] name={
"java","java2","java3","java4","java5","java6","java7","java8"
};
System.out.println("共"+lb.money+"元"+" "+lb.num+"个");
for(int i=0;i<name.length;i++){
lb.getBag(name[i]);
Random r=new Random();
try {
Thread.sleep(r.nextInt(3000));//模拟抢红包的过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
把代码中的endtime设为5000,结果如下: