使用Java程序模拟抢红包
这里给出的随机抢红包算法比较简单,本例子假设当前红包是52.0元,参与抢红包的人是6人!
RedEnvelope.java
public abstract class RedEnvelope {
public double remainMoney; //红包当前金额
public int remainPeople; //当前参与抢红包的人数
public double money; //当前用户抢到的金额
public abstract double giveMoney(); //抽象方法,具体怎么抢红包由子类完成
}
RandomRedEnvelope.java
import java.util.Random;
public class RandomRedEnvelope extends RedEnvelope{
double minMoney; //可以抢到的最小金额
int integerRemainMoney; //红包中的钱用分表示
int randomMoney; //给用户抢的钱
Random random;
RandomRedEnvelope(double remainMoney,int remainPeople){
random = new Random();
minMoney = 0.01; //minMoney的值是0.01,保证用户至少能抢到0.01元
this.remainMoney = remainMoney;
this.remainPeople = remainPeople;
integerRemainMoney = (int)(remainMoney*100); //把钱用分表示
if(integerRemainMoney<remainPeople*(int)(minMoney*100)){
integerRemainMoney = remainPeople*(int)(minMoney*100);
this.remainMoney = (double)integerRemainMoney;
}
}
public double giveMoney(){
if(remainPeople<=0){
return 0;
}
if(remainPeople==1){
money = remainMoney;
remainPeople--;
return money;
}
randomMoney =random.nextInt(integerRemainMoney);
//该金额randomMoney在[0,integerRemainMoney]区间内
if(randomMoney<(int)(minMoney*100)){
randomMoney = (int)(minMoney*100); //保证用户至少能抢到1分
}
int leftOtherPeopleMoney = integerRemainMoney - randomMoney;
//leftOtherPeopleMoney是当前用户留给其余人的金额(单位是分)
int otherPeopleNeedMoney = (remainPeople-1)*(int)(minMoney*100);
//otherPeopleNeedMoney是保证其他人能够继续抢的最少金额(单位是分)
if(leftOtherPeopleMoney<otherPeopleNeedMoney){
randomMoney -= (otherPeopleNeedMoney-leftOtherPeopleMoney);
}
integerRemainMoney = integerRemainMoney - randomMoney;
remainMoney = (double)(integerRemainMoney/100.0); //钱的单位转换成元
remainPeople--;
money = (double)(randomMoney/100.0);
return money; //返回用户抢到的钱(单位是元)
}
}
Test.java
public class Test {
public static void main(String[] args){
RedEnvelope redEnvelope = new RandomRedEnvelope(52.00,6);
System.out.printf("以下用循环输出%d个人抢%.2f元的随机红包:\n",redEnvelope.remainPeople,redEnvelope.remainMoney);
showProcess(redEnvelope);
}
public static void showProcess(RedEnvelope redEnvelope){
double sum = 0;
while(redEnvelope.remainPeople>0){
double money = redEnvelope.giveMoney();
System.out.printf("%.2f\t",money);
sum = sum+money;
}
String s = String.format("%.2f",sum); //金额保留两位小数
sum = Double.parseDouble(s);
System.out.printf("\n%.2f元的红包被抢完",sum);
}
}