为什么80%的码农都做不了架构师?>>>   

看了微信红包的算法实现探讨(基于PHP)一文,我尝试使用C++重现,代码如下:

#include <iostream>
#include <cstdlib>
#include <ctime>int Random(int _max)
{_max = _max > 0 ? _max : 1;static bool begin = false;if (!begin){srand((unsigned)time(nullptr)); //用于保证是随机数begin = true;}return rand() % _max;  //用rand产生随机数并设定范围
}int main()
{using namespace std;double total_money = 10;int total_people = 8;double min_money = 0.01;double *per_money = new double[total_people];for (int i = 0; i < total_people - 1; i++){double safe = (total_money - (total_people - i)*min_money) / (total_people - i);double var_money = min_money + (double)Random((int)safe * 100) / 100;per_money[i] = var_money;total_money -= var_money;}per_money[total_people - 1] = total_money;for (int i = 0; i < total_people; i++){cout << i << ": " << per_money[i] << endl;}delete[] per_money;return 0;
}

程序运行效果不太理想,最后一个红包金钱额数总是5~10倍于其它红包,这是由于C++提供的随机函数是均匀分布的。运行效果:共10元,8个红包,分配为0.49、0.24、0.01、0.31、0.64、1.33、1.2、5.78。

在网上查找到这一篇微信红包算法探讨,对代码重新封装如下,运行效果不错:

random.h

#ifndef MY_RANDOM_H
#define MY_RANDOM_H#include <cstdlib>
#include <ctime>namespace keyven
{int rand(){static bool begin = false;if (!begin){srand((unsigned)time(nullptr)); //用于保证是随机数begin = true;}return std::rand();  //用rand产生随机数并设定范围}
}#endif

money.h

#ifndef MY_MONEY_H
#define MY_MONEY_H#include "random.h"
#include <cmath>
#include <vector>#define TWO_PI 6.2831853071795864769252866namespace danye_me
{double generateGaussianNoise(const double mu, const double sigma){static bool haveSpare = false;static double rand1, rand2;if (haveSpare){haveSpare = false;return (sigma * sqrt(rand1) * sin(rand2)) + mu;}haveSpare = true;rand1 = keyven::rand() / ((double)RAND_MAX);if (rand1 < 1e-100) rand1 = 1e-100;rand1 = -2 * log(rand1);rand2 = (keyven::rand() / ((double)RAND_MAX)) * TWO_PI;return (sigma * sqrt(rand1) * cos(rand2)) + mu;}std::vector<double> generateMoneyVector(const double mon, const int pics){std::vector<double> valueVec;double moneyLeft = mon - pics * 0.01;double mu, sigma;double noiseValue;double TempSum = 0;for (int i = 0; i < pics - 1; i++){mu = moneyLeft / (pics - i);sigma = mu / 2;noiseValue = generateGaussianNoise(mu, sigma);if (noiseValue < 0) noiseValue = 0;if (noiseValue > moneyLeft) noiseValue = moneyLeft;valueVec.push_back((int)((noiseValue + 0.01) * 100) / (double)100);TempSum += (int)((noiseValue + 0.01) * 100) / (double)100;moneyLeft -= noiseValue;}valueVec.push_back(mon - TempSum);return valueVec;}
}#endif

main.cpp

#include "money.h"
#include <iostream>
#include <iomanip>int main()
{double total_money = 10.8;int people = 7;double Test_Sum = 0;std::vector<double> packets = danye_me::generateMoneyVector(total_money, people);for (std::vector<double>::iterator it = packets.begin(); it != packets.end(); it++){std::cout << std::setprecision(2) << std::setiosflags(std::ios::fixed | std::ios::showpoint) << *it << std::endl;Test_Sum += *it;}std::cout << "Sum: " << Test_Sum << std::endl;system("pause");return 0;
}

运行效果:共10.8元,7个红包,分配为0.87、1.53、1.90、1.92、2.25、0.79、1.54。

有兴趣可以再看看这篇:微信红包的架构设计简介

Reference

微信红包的算法实现探讨(基于PHP)

微信红包算法探讨

微信红包的架构设计简介

转载于:https://my.oschina.net/keyven/blog/618285

微信红包随机算法实现相关推荐

  1. 微信红包随机数字_微信红包随机算法转载

    php固定红包 + 随机红包算法 1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法. 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行. 2 随 ...

  2. 前端实现红包雨功能_最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台公众号回复 Android加入安卓技术群 "  1.引言 这个系列文章已经整理了10篇,但都没有涉及到具体的红包算法实现,主要有以下两方面原因.一方 ...

  3. 最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 " 本文内容编写时,参考了网上的资料,详见"参考资料"部分,感谢分享者..本文已同步发 ...

  4. c语言微信抢红包的随机算法,微信红包随机算法是什么?

    现在微信上面最受欢迎的一项功能莫过于微信红包了,不知道大家有没有研究过,这个红包的数值是随机的,有的时候自己是运气王,有的时候手气特别的差,下面小编为大家介绍微信红包随机算法. 算法很简单,不是提前算 ...

  5. 最全微信红包分配算法,不只是二倍均值那么简单

    最全微信红包分配算法!不只是二倍均值那么简单! 一.序言 本文要解决什么问题? 抢红包的顺序对红包收益有无影响? 抢红包的顺序对当运气王的概率有无影响? 红包接龙游戏每次都是先抢好还是后抢好? 红包接 ...

  6. php 红包算法,PHP语言:实现微信红包拆分算法

    本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. · 修复最后一个红包输出未保留2位数 · 修复领取的红包金额低于最小红包限制 * 红 ...

  7. Java编程随机发红包,红包随机算法Java实现

    需求:红包总金额随机后每份金额:最大值200, 最小值0.01:最大份数100: 工具:idea 参考:微信红包算法以及带上下限的红包算法 基于微信红包算法以及带上下限的红包算法优化,修改了部分极值时 ...

  8. java实现红包要多少钱_java实现微信红包分配算法

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 java 实现微信红包分配算法 2017/03/25 0 红包算法分析有人认为,抢红包的额度是从 0.01 到剩余平均值 *N(N 是一个系数,决 ...

  9. 微信红包分配算法原理

    微信红包分配算法原理 春节这几天,大家在红包群里抢了不少红包了吧,有没有试过总金额上百的红包抢到手之后只有几毛钱?为什么有些人能抢到总金额的一半甚至更多?下面,我来给大家讲讲微信红包分配的算法原理. ...

最新文章

  1. 如何让两个div在同一行显示?一个float搞定
  2. 鸟哥的Linux私房菜(基础篇)- 第十五章、磁碟配额(Quota)与进阶文件系统管理
  3. pandas to_csv 最左边 多一列 索引值 问题处理
  4. DataRow的RowState属性变化问题
  5. c#水晶报表连接mysql,如何将数据库绑定到水晶报表?
  6. callback函数_Nodejs 源码解析 util.promisify 如何将 Callback 转为 Promise
  7. Activity 的窗口去头的方式
  8. 为什么最近「骚扰电话」明显越来越多了?
  9. 第一个spring冲刺团队贡献分(80分满分)
  10. 【java】线程的简单使用以及注意的问题
  11. vb还是python强大-vb和python哪个速度快
  12. linux 777权限_认识Linux之Linux命令-用户、权限管理(8)
  13. Processing编程学习指南2.5 Processing中的代码
  14. Luogu1919 【模板】A*B Problem升级版(FFT快速傅里叶)
  15. SCM供应链管理的背景及意义
  16. 2020教师计算机考试笔试题,2020教师招聘考试《信息技术》练习题之答案解析
  17. Excel做文件归档
  18. 收藏!万字长文盘点美国、德国、日本和韩国数字科技创新战略
  19. mysql修改my.ini_MySQL配置文件(my.ini)详解
  20. python创建ppt_ppt自动化创建工具——python-pptx

热门文章

  1. 【必读】2019年深度学习自然语言处理最新十大发展趋势, 附报告下载
  2. 人工智能的社会、伦理与未来
  3. 物联网面临的7大网络安全威胁
  4. 「谷歌大脑」提出通过对长序列进行摘要提取,AI可自动生成「维基百科」
  5. 【业界】Facebook的基础AI算法是如何驱动社交网络的发展?
  6. 想学 Java 的你,来看看这 20 个实战项目!
  7. 以太坊创始人V 神:普通人看见现在,天才看见未来
  8. MCMC(二)马尔科夫链
  9. markdown编辑
  10. volatile关键字的作用、原理