微信發紅包算法

今天去搜狐參加實習生筆試,最後有道題就是發紅包。

題目要求如下:

  

1、每個人都要能夠領取到紅包;

2、每個人領取到的紅包金額總和=總金額;

3、每個人領取到的紅包金額不等,但也不能差的太離譜,不然就沒趣味;


網上搜索答案,方法不一,我認爲比較好的算法如下,待補充。
解法一:
先生成 num 個0-1隨機數,計算它們的和,然後用每個隨機數除以此和再乘以設定的total,就可以了。
弊端:1. 可能生成隨機數0,這樣就有人領不到紅包
          2. 分佈符合均勻分佈。如果能滿足正態分佈,就更符合題意。
經調試後代碼如下:
import java.util.*;

public class Test{

public static void main(String args[]){
	randSum(10,10);
}	
private static void randSum(int num, float total) {
//random number generator
Random rn = new Random();
//container of random numbers
ArrayList<Float> randNums = new ArrayList<Float>();
//container of final results
ArrayList<Float> finalResult = new ArrayList<Float>();
// the sum of generated random numbers
float genSum = 0;
//generate random numbers
for (int i = 0; i < num; i++) {
float r0 = rn.nextFloat();
genSum += r0;
randNums.add(r0);
//System.out.println(randNums.get(i));
}

// calculate final results
for (int i = 0; i < randNums.size(); i++) {
//finalResult.add( (randNums.get(i)/genSum)*total);
 float rNum = (randNums.get(i)/genSum)*total;
 finalResult.add(rNum);
}
//print results
Collections.sort(finalResult);
float sum = 0;
for(float x : finalResult){
System.out.println(x);
sum += x;
}
// print final total amount
//System.out.println(sum);

}
}

運行結果:
0.006173989
0.08440706
0.2599706
0.82681423
1.0897439
1.2572217
1.4412992
1.4780049
1.643845
1.9125202


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章