微信发红包算法

今天去搜狐参加实习生笔试,最后有道题就是发红包。

题目要求如下:

  

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


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