博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信红包的随机算法是怎样实现的?
阅读量:6994 次
发布时间:2019-06-27

本文共 1540 字,大约阅读时间需要 5 分钟。

我在知乎上看到这样一个问题

有人说腾讯大致是这样实现的:

public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) {    // remainSize 剩余的红包数量    // remainMoney 剩余的钱    if (_leftMoneyPackage.remainSize == 1) {        _leftMoneyPackage.remainSize--;        return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100;    }    Random r     = new Random();    double min   = 0.01; //    double max   = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;    double money = r.nextDouble() * max;    money = money <= min ? 0.01: money;    money = Math.floor(money * 100) / 100;    _leftMoneyPackage.remainSize--;    _leftMoneyPackage.remainMoney -= money;    return money;}复制代码

也有人做了正太分布、方差分析、回归分析、统计模拟等,图太长我就不贴了。

然而

  1. 所有答案都是“取时随机”,即设计“红包池”的概念,然后在抽取时随机取数。
  2. 所有答案都是“钱的随机”,即随机金额,然后return。

下面我们换个思路,现在我们把所有的钱换成1分的硬币,把红包想象成罐子,然后撒币

/** * @param count 红包数 * @param money 总金额 * @return */public static Integer[] ranRedPac(Integer count, Integer money) {	Integer[] result = new Integer[count];	for (int i = 1; i <= money; i++) {		int n = new Random().nextInt(count);		result[n] = result[n] == null ? 1 : result[n] + 1;	}	return result;}//测试public static void main(String[] args) {	Arrays.asList(ranRedPac(10, 5000000)).forEach(i -> System.out.println(i));	System.out.println("sum: " + Arrays.asList(ranRedPac(10, 50)).stream().mapToInt(i -> i).sum());}复制代码

每分钱随机选择红包。

至于什么回归分析,统计模拟统统用不上

本例中我们摒弃“抽取”、“随机金额”这样的传统概念,使钱拥有选择意识,执行“随机”行为,自然而然红包就有了随机金额的属性。

改变一下思路,别把简单问题复杂化。

我们在编码设计时,通常会考虑现实生活中的逻辑,并把对象抽象成类,行为抽象成方法。但是,我们偶尔也要考虑思维反转

当然,我的代码有一定的弊端。

思维是最重要的。

转载地址:http://zfzvl.baihongyu.com/

你可能感兴趣的文章
Hibernate基础实例
查看>>
索引设计规范
查看>>
python笔记4:计算输入时间为当年的第几天
查看>>
Linux 常用命令集合
查看>>
ARP的应用案例,测试ARP防火墙的主动防御功能;
查看>>
浅谈ipsec
查看>>
我的友情链接
查看>>
新手入门
查看>>
centos下lamp源码安装
查看>>
cinder-volume服务状态为down 解决方法
查看>>
实战:通过建立的会话查看***
查看>>
Ionic CLI 升级到最新版本
查看>>
移动大时代:烽火Exmobi的主打歌
查看>>
java 递归
查看>>
Linux Shell脚本测试案例(二)
查看>>
常用节点类型
查看>>
2.4-hash类型常用命令
查看>>
MongoDB 用户认证
查看>>
一些开源镜像站
查看>>
RAID
查看>>