微信发红包算法

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

题目要求如下:

  

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值