微信红包的随机算法是怎样实现的?

移动开发 算法
微信红包的随机算法是怎样实现的?本例中我们摒弃“抽取”、“随机金额”这样的传统概念,使钱拥有选择意识,执行“随机”行为,自然而然红包就有了随机金额的属性。改变一下思路,别把简单问题复杂化。

我在知乎上看到这样一个问题 微信红包的随机算法是怎样实现的?

[[218949]]

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

 

  1. public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) { 
  2.     // remainSize 剩余的红包数量 
  3.     // remainMoney 剩余的钱 
  4.     if (_leftMoneyPackage.remainSize == 1) { 
  5.         _leftMoneyPackage.remainSize--; 
  6.         return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100; 
  7.     } 
  8.     Random r     = new Random(); 
  9.     double min   = 0.01; // 
  10.     double max   = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2; 
  11.     double money = r.nextDouble() * max; 
  12.     money = money <= min ? 0.01: money; 
  13.     money = Math.floor(money * 100) / 100; 
  14.     _leftMoneyPackage.remainSize--; 
  15.     _leftMoneyPackage.remainMoney -= money; 
  16.     return money; 

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

然而

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

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

 

  1. /** 
  2.  * @param count 红包数 
  3.  * @param money 总金额 
  4.  * @return 
  5.  */ 
  6. public static Integer[] ranRedPac(Integer countInteger money) { 
  7.     Integer[] result = new Integer[count]; 
  8.     for (int i = 1; i <= money; i++) { 
  9.         int n = new Random().nextInt(count); 
  10.         result[n] = result[n] == null ? 1 : result[n] + 1; 
  11.     } 
  12.     return result; 
  13.  
  14. //测试 
  15. public static void main(String[] args) { 
  16.     Arrays.asList(ranRedPac(10, 5000000)).forEach(i -> System.out.println(i)); 
  17.     System.out.println("sum: " + Arrays.asList(ranRedPac(10, 50)).stream().mapToInt(i -> i).sum()); 

每分钱随机选择红包。

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

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

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

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

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

思维是最重要的。

责任编辑:未丽燕 来源: SegmentFault
相关推荐

2015-11-12 09:39:28

微信红包实现

2020-08-05 12:35:06

微信朋友圏广告

2020-02-14 14:13:13

架构运维技术

2021-11-16 23:11:24

Java微信抢红包

2014-06-18 13:12:01

Wi-Fi微信

2015-02-26 13:54:01

微信支付宝红包

2018-11-12 10:20:29

网络安全网络安全技术周刊

2015-04-16 10:35:08

微博微博如何实现

2015-07-15 10:09:43

2022-01-27 07:43:38

微信拜年红包iOS

2018-03-27 10:15:58

微信红包个人信息

2014-02-04 07:59:27

2015-08-03 17:21:26

APP

2024-08-19 11:31:41

2021-05-11 15:42:12

数字人民币支付宝微信

2017-10-10 14:20:11

随机森林分类算法

2022-01-14 19:00:37

微信微信红包移动应用

2020-07-27 15:06:14

微信张小龙焦虑

2023-10-30 01:08:35

微信红包高性能架构

2018-05-23 09:11:42

微信Android开发面试
点赞
收藏

51CTO技术栈公众号