微信发红包算法

来源:互联网 发布:yum安装hba卡rpm包 编辑:程序博客网 时间:2024/06/08 02:26

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

题目要求如下:

  

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 generatorRandom rn = new Random();//container of random numbersArrayList<Float> randNums = new ArrayList<Float>();//container of final resultsArrayList<Float> finalResult = new ArrayList<Float>();// the sum of generated random numbersfloat genSum = 0;//generate random numbersfor (int i = 0; i < num; i++) {float r0 = rn.nextFloat();genSum += r0;randNums.add(r0);//System.out.println(randNums.get(i));}// calculate final resultsfor (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 resultsCollections.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


0 0
原创粉丝点击