java微信红包_Java模拟微信发红包(普通红包、拼手气红包)
假設紅包總額M元,分給N個人。
滿足條件:
如果是普通紅包,每個人獲得的金額都一樣;
如果是拼手氣紅包,則有所區別,但不能金額過于離譜,比如第一個獲得的太多,以至于后來的人都幾乎沒得分。
注意點:
1.總額必須準確
2.最小金額為0.01元,即1分;
3.獲得紅包金額的概率須加以控制。
一、普通紅包
核心代碼:
public ArrayList divide(int totalMoney, int count) {
// 創建保存各個紅包金額的集合
ArrayList list = new ArrayList<>();
// 計算平均金額
int avgMoney = totalMoney / count;
// 設置前面count‐1個人都是平均的金額
for (int i = 0; i < count ‐ 1; i++) {
list.add(avgMoney);
// 從總金額中減去已分配的金額,就是最后一個人剩余的金額
totalMoney ‐= avgMoney;
}
// 將剩余的金額設置給最后一個人
list.add(totalMoney);
return list;
}
二、拼手氣紅包
本質上,手氣紅包就是把總金額 totalMoney 隨機分成指定的 count 份,所以必須規定每一份金額的取值范圍。如果范圍太小,可能導致后分配紅包金額特別大。反之范圍太大,可能導致后分配紅包金額為0,不夠分。可見,取值范圍的定義規則,是手氣紅包的關鍵所在。
我們規定:每一份隨機金額范圍(除最后一份),最小值為1,最大值為當前剩余平均金額的2倍 ,單位為"分"。
計算公式:
當前剩余平均金額=剩余總金額/剩余紅包個數——程序中,建議換算為"分"進行運算。
核心代碼:
public ArrayList divide(int totalMoney, int count) {
// 創建保存各個紅包金額的集合
ArrayList list = new ArrayList<>();
// 定義循環次數,總個數‐1次
int time = count ‐ 1;//注意此處為何減一
// 創建隨機數對象
Random random = new Random();
//總金額轉換成分
moneyfen=totalMoney*100;
// 循環分配
for (int i = 0; i < time; i++) {
/*
* 每次重新計算,生成隨機金額
* 隨機范圍: totalMoney / count * 2,totalMoney不斷的減少,
* count也不斷的減少,所以這是一個可變化的范圍.
*/
int moneyget = random.nextInt(moneyfen / count * 2) + 1;
// 金額添加到集合
list.add(money/100);//加減乘除計算,會先統一操作數的精度,其規則是先統一成精度高的數。
//如上,double型/int型、int型/double型,最后都轉成double型/double型。
// 總金額扣除已分配金額
monfen ‐= moneyget;
// 紅包個數‐1
count‐‐;
}
// 剩余的金額,為最后一個紅包
list.add(moneyfen/100);
return list;
}
備注:
代碼中用到java.util.Random類。下面Random()的兩種構造方法:
Random():創建一個新的隨機數生成器。
Random(long seed):使用單個 long 種子創建一個新的隨機數生成器。
如下面的Java代碼:
Random rand =new Random(25);
int i;
i=rand.nextInt(100);
初始化時25并沒有起直接作用(注意:不是沒有起作用),rand.nextInt(100);中的100是隨機數的上限,產生的隨機數為0-100的整數,不包括100。
下面是Java.util.Random()方法摘要:
protected int next(int bits):生成下一個偽隨機數。
boolean nextBoolean():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的boolean值。
void nextBytes(byte[] bytes):生成隨機字節并將其置于用戶提供的 byte 數組中。
double nextDouble():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分布的 double值。
float nextFloat():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分布float值。
double nextGaussian():返回下一個偽隨機數,它是取自此隨機數生成器序列的、呈高斯(“正態”)分布的double值,其平均值是0.0標準差是1.0。
int nextInt():返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分布的 int 值。
int nextInt(int n):返回一個偽隨機數,它是取自此隨機數生成器序列的、在(包括和指定值(不包括)之間均勻分布的int值。
long nextLong():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的 long 值。
void setSeed(long seed):使用單個 long 種子設置此隨機數生成器的種子。
下面給幾個例子:
生成[0,1.0)區間的小數:double d1 = r.nextDouble();
生成[0,5.0)區間的小數:double d2 = r.nextDouble() * 5;
生成[1,2.5)區間的小數:double d3 = r.nextDouble() * 1.5 + 1;
生成-231到231-1之間的整數:int n = r.nextInt();
生成[0,10)區間的整數:
int n2 = r.nextInt(10);//方法一
n2 = Math.abs(r.nextInt() % 10);//方法二
參考資料:
http://blog.sina.com.cn/s/blog_93dc666c0101h3gd.html
https://www.jb51.net/article/176121.htm
http://blog.csdn.net/wpjava/article/details/6004492
https://www.cnblogs.com/ningvsban/p/3590722.html
總結
以上是生活随笔為你收集整理的java微信红包_Java模拟微信发红包(普通红包、拼手气红包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创意黑板粉笔字效果PPT模板
- 下一篇: 无限制高速下载百度网盘大文件方法