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

新手学堂018

微信红包的随机算法是怎样实现的?,第1张

我们在一个20人的群中,自己发红包以及结合其他人发出红包的情况,整合成两轮的数据。每次金额设置都是20块并且有20个,第一轮是发了15次,第二轮是发了19次,总结成表格,然后为了避免突发的数据影响判断,我们将两轮数据杂糅从而生成了其他的三轮数据,一共是五轮数据。罗列如下表,高亮的数据为最佳手气。每一列的数据最早抢到红包的在最底端,越往上越晚抢。

从所有**的数值(最佳手气金额)可看出,所有最佳手气值都在平均值2的前后附近(平均值=总金额/红包总个数,这里平均值=20/20=1),事实上确实如此,可通过微信红包分发算法得到验证,算法具体见后文

然后我们选取部分数据开始制作散点图。横轴为1-20,分别表示抢到红包的人的编号,随递增而越早。也就是20代表最早抢到的人。纵轴为金额。同样的形状颜色的点代表一次发红包,然后我们抓取部分数据显示为散点图,越密集代表该顺序位的用户得到的金额越稳定。散点图如下:

规律一:我们可以看到,所有红包大多数金额分布在05到15元之间,显示为图中方框所示,大部分点都分布在这个位置。然后是顺序位密集程度的对比,可以发现20、19,也就是最先抢到红包的人,小圆圈所示基本的点都集中在小范围,说明先抢红包的人得到的金额会比较稳定,但同时最佳手气的概率也比较低。大圆圈所示的是极不稳定,飘忽的金额分布,表示越晚抢红包得到的金额会飘忽不稳,但同时,抢到最佳手气等大金额的红包概率也比早抢的高。

根据上面的分析,我们又写了一个过滤计数函数,针对金额的分段的红包个数进行统计:

比如20-25

得到如下金额分布:

折线图:

规律二:绝大多数的红包的金额都集中在1-15,也就是说20块钱发20个红包的金额分布集中在比平均数大一点点的附近,同时较大幅超过平均数金额的红包大大少于低于于平均数的红包数量。

那我们继续扩大数据的规模,将几轮数据的均值和标准差分别做成折线图:

综合上面各个折线图的情况,我们可以得到越早抢红包的标准差越小,越晚抢红包的标准差越大,但同时,由均值和总额可以看出来,越早抢红包的均值往往要更高,红包金额得到最佳手气概率也会相对较小,越晚抢红包的人则得到最佳手气等大手气的概率更大。

为了得到更为趋近规律的曲线和规律,我们决定将两轮真实数据合并起来,然后给出幂函数的趋近线(虚线),如下图:

由于均值受极值波动影响较大,所以我们去除一些因为偶然差产生的极端点(圆圈的点)从而发现是递增的趋势。

规律三:可以很明显的看到,均值是随着抢红包的越晚而缓慢递减,标准差值同时也往上递增,这个趋势结合之前的分析,我们猜想,即标准差越大说明,领取到最大的红包和最小红包的风险越大,也就是说越晚抢标准差越大,对于冒险主义者来讲是最好的,因为他有很大概率获得最大的金额,但也大概率获得最小的红包,风险与收益并存;均值越大,说明每次都拿到一个不大不小的红包,虽然获得最小和最大金额红包的概率很小,但起码不亏本,也就是说越早抢,均值越稳定,这比较适合不喜欢冒险的人。

验证预测结果:

21:24分 发送预测结果到另一位同学微信:

           

随后开始发红包:

结果:

最佳手气为第8个人且金额为113

与预测结果一致,规律基本正确!

总结:

(1)最佳手气为113块,根据我们推导的预测公式=总额/红包总个数2随机数(0-2的double数), 也就是说最佳手气在总额/红包总个数2值的前后附近。这里我们判断在08-13之间,推断正确

(2)平均值为05元,05-08元的红包有3个,小于05的红包有6个,说明大于平均值的红包个数多于小于平均值的个数。与我们的第二点预测完全正确

(3)最佳手气位置:根据我们的散点图发现,最先抢到红包的人,得到的金额会比较稳定,但同时最佳手气的概率也比较低。表示越晚抢红包得到的金额波动较大,但同时抢到最佳手气等大金额的红包概率也比早抢的高。所以我们推断,最佳手气位置在最后20%-30%之间。

微信红包随机分发算法c++模拟:

基本思路:每次抢到一个红包金额等于:红包剩余金额/红包剩余个数2随机数(0-1的double型),如果计算的结果小于等于001,则取001值

主要代码:

double packages[50000];

double Luckiest_money=0;

void getPackage(int remainSize,double remainMoney){

srand((unsigned)time(NULL));

for(int i=0;i

提起如何给闺蜜发一个有意义的红包,大家都知道,有人问微信红包封面序列号是什么?另外,还有人想问谁有微信红包封面序列号?你知道这是怎么回事?其实求微信红包封面序列号,下面就一起来看看我大学室友结婚,我打算发1111,2222~9999的红包给他,各位帮我给每个红包想个寄语呗,跪谢!!!希望能够帮助到大家!

如何给闺蜜发一个有意义的红包

1、在这喜庆祝福的时刻,愿神引导你们的婚姻,如河水流归大海,成为一体,不再是二,并且奔腾不已,生生不息!

2、新娘新郎新家庭,人新事新样样新,互敬互爱心连心,心心相印心贴心,互让互勉常谈心,信心决心永远新。真诚地祝愿你新婚快乐!

3、送你一件红嫁衣,领子携来幸福,袖子挥来甜蜜,纽紧浪漫,红线串起。兜子兜来,腰绳拴住。祝福你新婚大吉,生活如意。

4、十年同船渡,百年共枕眠。于茫茫人海中找到他(她),分明是千年之前的一段缘;无数个偶然堆积而成的必然,怎能不是三生石上精心镌刻的结果呢?用真心呵护这份缘吧,真爱的你们,祝你们新婚快乐!

求微信红包封面序列号

5、牵手,让生命之花怒放;相伴,让生活充满幸福渴望;笑容,让快久停留身旁;有了爱,生活处处是芬芳,亲爱的朋友,祝福你,新婚快乐万年长!

如何给闺蜜发一个有意义的红包:微信红包封面序列号是什么?

微信红包封面序列号是使用新微信红包封面的权限号码,输入后才能添加和使用新的微信红包封面,具体步骤如下:

1、点开[],点击要发送的好友,如下图所示。

2、然后点击下方的[发消息],如下图所示。微信生日快乐红包封面序列号。

3、然后点击下方的[+],如下图所示。

4、选择[红包],如下图所示。发红包1111到9999祝福语。

5、继续点击[红包],如下图所示。

6、点击红包以后,选择[红包封面],如下图所示。闺蜜十个红包十句生日祝福。

7、选择[添加红包封面],如下图所示。

8、然后输入11位封面序列号就可以了,如下图所示。

如何给闺蜜发一个有意义的红包:谁有微信红包封面序列号?

微信红包封面正版序列号:应思杰马克丁要求,暂不提供序列号;微信如何向同一个人连发红包。

微信红包封面第二版序列号:;

微信红包封面册码:1—–L;

微信红包封面购买密钥:–YWTTJVG–;

微信红包封面激活代码:-FBF2—;闺蜜十个红包十句表白。

在“微信红包”这个功能的设计上,遵循了简单的原则。发送方通过“新年红包”公众号,选择发送红包的数量和金额,以及祝福的话语,通过“微信支付”进行支付,就可以发送给好友;

接收方则在打开后相应收益,只需要将与微信关联,就可以在一个工作日后提现。年1月27日前,用户在抢红包之前,要先写上祝福,然后才可以抢。在这之后,已经改为先抢红包再发送祝福的过程。

微信派发红包的形式共有两种,第一种是普通等额红包,一对一或者一对多发送;第二种更有新意,被称作“拼手气群红包”,用户设定好总金额以及红包个数之后,可以生成不同金额的红包。红包仪式感1到10多少钱。

以上就是与我大学室友结婚,我打算发1111,2222~9999的红包给他,各位帮我给每个红包想个寄语呗,跪谢!!!相关内容,是关于微信红包封面序列号是什么?的分享。看完如何给闺蜜发一个有意义的红包后,希望这对大家有所帮助!

微信红包随机数字_微信随机红包数详解和算法代码

1 需求

写⼀个固定红包 + 随机红包

固定红包就是每个红包⾦额⼀样,有多少个就发多少个固定红包⾦额就⾏。

随机红包的需求是。⽐如红包总⾦额5元,需要发10个红包。随机范围是 001到099;5元必需发完,⾦额需要有⼀定趋势的正态分布。

(099可以任意指定,也可以是 avg 2 - 001;⽐如avg = 5 / 10 = 05;(avg 2 - 001 = 099))

2 需求分析

21 固定红包

如果是固定红包,则算法是⼀条直线。t就是固定红包的额度。如图。

f(x) = t;(1 <= x <= num)

imagepng

22 随机红包

如果我们使⽤随机函数rand。rand(001,099);那么10次随机,如果最坏情况都是⾦额099,总⾦额就是99元。会超过5元。⾦额也会不正态分布。最后思考了⼀下借助与数学函数来当作随机红包的发⽣器,可以⽤抛物线,三⾓函数。最后选定了等腰三⾓线性函数。

1 算法原理

如果需要发红包总⾦额是totalMoney,红包个数是num个,⾦额范围是[min,max],线性⽅程如图。

imagepng

三个点的坐标:

(x1,y1) = (1,min)

(x2,y2) = (num/2,max)

(x3,y3) = (num,min)

确定的线性⽅程:

$y = 10 ($x - $x1) / ($x2 - $x1) ($y2 - $y1) + $y1 ; (x1 <= x <= x2)

$y = 10 ($x - $x2) / ($x3 - $x2) ($y3 - $y2) + $y2; (x2 <= x <= x3)

修数据:

y(合) = y1 + y2 + y3 + ynum;

y(合)有可能 > totalMoney ,说明⽣成⾦额多了,需要修数据,则从(y1,y2,y3ynum)这些每次减少001。直到y(合) = totalMoney。

y(合)有可能 < totalMoney ,说明⽣成⾦额少了,需要修数据,则从(y1,y2,y3ynum)这些每次加上001。直到y(合) = totalMoney。

2 算法原理样例

如果需要发红包总⾦额是11470,红包个数是7400个,⾦额范围是[001,309],线性⽅程如图。

imagepng

3 需求设计

31 类图设计

imagepng

32 源码设计

/

随机红包+固定红包算法[策略模式]

/

//配置传输数据DTO

class OptionDTO

{

//红包总⾦额

public $totalMoney;

//红包数量

public $num;

//范围开始

public $rangeStart;

//范围结算

public $rangeEnd;

//⽣成红包策略

public $builderStrategy;

//随机红包剩余规则

public $randFormatType; //Can_Left:不修数据,可以有剩余;No_Left:不能有剩余public static function create($totalMoney,$num,$rangeStart,$rangEnd, $builderStrategy,$randFormatType = 'No_Left')

{

$self = new self();

$self->num = $num;

$self->rangeStart = $rangeStart;

$self->rangeEnd = $rangEnd;

$self->totalMoney = $totalMoney;

$self->builderStrategy = $builderStrategy;

$self->randFormatType = $randFormatType;

return $self;

}

}

//红包⽣成器接⼝

interface IBuilderStrategy

{

//创建红包

public function create();

//设置配置

public function setOption(OptionDTO $option);

//是否可以⽣成红包

public function isCanBuilder();

//⽣成红包函数

public function fx($x);

}

//固定等额红包策略

class EqualPackageStrategy implements IBuilderStrategy {

//单个红包⾦额

public $oneMoney;

//数量

public $num;

public function __construct($option = null)

{

if($option instanceof OptionDTO)

{

$this->setOption($option);

}

}

public function setOption(OptionDTO $option)

{

$this->oneMoney = $option->rangeStart;

$this->num = $option->num;

}

public function create()

{

$data = array();

if(false == $this->isCanBuilder())

{

return $data;

}

$data = array();

if(false == is_int($this->num) || $this->num <= 0) {

return $data;

}

for($i = 1;$i <= $this->num;$i++)

{

$data[$i] = $this->fx($i);

}

return $data;

}

/

等额红包的⽅程是⼀条直线

@param mixed $x

@access public

@return void

/

public function fx($x)

{

return $this->oneMoney;

}

/

是否能固定红包

@access public

@return void

/

public function isCanBuilder()

{

if(false == is_int($this->num) || $this->num <= 0)

{

return false;

}

if(false == is_numeric($this->oneMoney) || $this->oneMoney <= 0)

{

return false;

}

//单个红包⼩于1分

if($this->oneMoney < 001)

{

return false;

}

return true;

}

}

//随机红包策略(三⾓形)

class RandTrianglePackageStrategy implements IBuilderStrategy

{

//总额

public $totalMoney;

//红包数量

public $num;

//随机红包最⼩值

public $minMoney;

//随机红包最⼤值

public $maxMoney;

//修数据⽅式:NO_LEFT: 红包总额 = 预算总额;CAN_LEFT: 红包总额 <= 预算总额public $formatType;

//预算剩余⾦额

public $leftMoney;

public function __construct($option = null)

{

if($option instanceof OptionDTO)

{

$this->setOption($option);

}

}

public function setOption(OptionDTO $option) {

$this->totalMoney = $option->totalMoney;

$this->num = $option->num;

$this->formatType = $option->randFormatType; $this->minMoney = $option->rangeStart;

$this->maxMoney = $option->rangeEnd;

$this->leftMoney = $this->totalMoney;

}

/

创建随机红包

@access public

@return void

/

public function create()

{

$data = array();

if(false == $this->isCanBuilder())

{

return $data;

}

$leftMoney = $this->leftMoney;

for($i = 1;$i <= $this->num;$i++)

{

$data[$i] = $this->fx($i);

$leftMoney = $leftMoney - $data[$i];

}

//修数据

list($okLeftMoney,$okData) = $this->format($leftMoney,$data);

//随机排序

shuffle($okData);

$this->leftMoney = $okLeftMoney;

return $okData;

}

/

是否能够发随机红包

@access public

@return void

/

public function isCanBuilder()

{

if(false == is_int($this->num) || $this->num <= 0)

{

return false;

}

if(false == is_numeric($this->totalMoney) || $this->totalMoney <= 0) {

return false;

}

//均值

$avgMoney = $this->totalMoney / 10 / $this->num;

//均值⼩于最⼩值

if($avgMoney < $this->minMoney )

{

return false;

}

return true;

}

/

获取剩余⾦额

@access public

public function getLeftMoney()

{

return $this->leftMoney;

}

/

随机红包⽣成函数。三⾓函数。[(1,001),($num/2,$avgMoney),($num,001)] @param mixed $x,1 <= $x <= $this->num;

@access public

@return void

/

public function fx($x)

{

if(false == $this->isCanBuilder())

{

return 0;

}

if($x < 1 || $x > $this->num)

{

return 0;

}

$x1 = 1;

$y1 = $this->minMoney;

//中间点

$x2 = ceil($this->num / 10 / 2);

//我的峰值

$y2 = $this->maxMoney;

//最后点

$x3 = $this->num;

$y3 = $this->minMoney;

//当x1,x2,x3都是1的时候(竖线)

if($x1 == $x2 && $x2 == $x3)

{

// '/_\'三⾓形状的线性⽅程

//'/'部分

if($x1 != $x2 && $x >= $x1 && $x <= $x2)

{

、 $y = 10 ($x - $x1) / ($x2 - $x1) ($y2 - $y1) + $y1; return number_format($y, 2, '', '');

}

//'\'形状

if($x2 != $x3 && $x >= $x2 && $x <= $x3)

{

$y = 10 ($x - $x2) / ($x3 - $x2) ($y3 - $y2) + $y2; return number_format($y, 2, '', '');

}

return 0;

}

/

格式化修红包数据

@param mixed $leftMoney

@param array $data

@access public

@return void

/

private function format($leftMoney,array $data)

{

//不能发随机红包

if(false == $this->isCanBuilder())

{

return array($leftMoney,$data);

}

//红包剩余是0

if(0 == $leftMoney) //⽆需修数据

return array($leftMoney,$data);

}

//数组为空

if(count($data) < 1)

{

return array($leftMoney,$data);

}

//如果是可以有剩余,并且$leftMoney > 0

if('Can_Left' == $this->formatType

&& $leftMoney > 0)

{

return array($leftMoney,$data);

}

// 如果还有余钱,则尝试加到⼩红包⾥,如果加不进去,则尝试下⼀个。while($leftMoney > 0)

{

$found = 0;

foreach($data as $key => $val)

{

//减少循环优化

if($leftMoney <= 0)

{

break;

}

//预判

$afterLeftMoney = (double)$leftMoney - 001;

$afterVal = (double)$val + 001;

if( $afterLeftMoney >= 0 && $afterVal <= $this->maxMoney)

{

$found = 1;

$data[$key] = number_format($afterVal,2,'','');

$leftMoney = $afterLeftMoney;

//精度

}

}

//如果没有可以加的红包,需要结束,否则死循环

//也就是会出现每个红包不分钱的情况,⽐如红包都已经最⼤值。这时必须在分的时候给予标志,防⽌死循环。if($found == 0)

{

break;

}

}

//如果$leftMoney < 0 ,说明⽣成的红包超过预算了,需要减少部分红包⾦额

while($leftMoney < 0)

{

$found = 0;

foreach($data as $key => $val)

{

if($leftMoney >= 0)

{

break;

}

//预判

$afterLeftMoney = (double)$leftMoney + 001;

$afterVal = (double)$val - 001;

if( $afterLeftMoney <= 0 && $afterVal >= $this->minMoney)

{

$found = 1;

$data[$key] = number_format($afterVal,2,'','');

$leftMoney = $afterLeftMoney;

$leftMoney = number_format($leftMoney,2,'','');

}

}

//如果⼀个减少的红包都没有的话,需要结束,否则死循环

if($found == 0)

{

}

}

return array($leftMoney,$data);

}

}

//维护策略的环境类

class RedPackageBuilder

{

// 实例

protected static $_instance = null;

/

Singleton instance(获取⾃⼰的实例)

@return MemcacheOperate

/

public static function getInstance()

{

if (null === self::$_instance)

{

self::$_instance = new self();

}

return self::$_instance;

}

/

获取策略使⽤反射

@param string $type 类型

@return void

/

public function getBuilderStrategy($type) {

$class = $type'PackageStrategy';

if(class_exists($class))

return new $class();

}

else

{

throw new Exception("{$class} 类不存在!");

}

}

public function getRedPackageByDTO(OptionDTO $optionDTO)

{

//获取策略

$builderStrategy = $this->getBuilderStrategy($optionDTO->builderStrategy); //设置参数

$builderStrategy->setOption($optionDTO);

return $builderStrategy->create();

}

}

class Client

{

public static function main($argv)

{

//固定红包

$dto = OptionDTO::create(1000,10,100,100,'Equal');

$data = RedPackageBuilder::getInstance()->getRedPackageByDTO($dto);

//print_r($data);

//随机红包[修数据]

$dto = OptionDTO::create(5,10,001,099,'RandTriangle');

$data = RedPackageBuilder::getInstance()->getRedPackageByDTO($dto); print_r($data);

//随机红包[不修数据]

$dto = OptionDTO::create(5,10,001,099,'RandTriangle','Can_Left');

$data = RedPackageBuilder::getInstance()->getRedPackageByDTO($dto);

//print_r($data);

}

59

百度文库VIP限时优惠现在开通,立享6亿+VIP内容

立即获取

微信红包随机数字_微信随机红包数详解和算法代码

微信红包随机数字_微信随机红包数详解和算法代码

1 需求

写⼀个固定红包 + 随机红包

固定红包就是每个红包⾦额⼀样,有多少个就发多少个固定红包⾦额就⾏。

随机红包的需求是。⽐如红包总⾦额5元,需要发10个红包。随机范围是 001到099;5元必需发完,⾦额需要有⼀定趋势的正态分布。

(099可以任意指定,也可以是 avg 2 - 001;⽐如avg = 5 / 10 = 05;(avg 2 - 001 = 099))

第 1 页

2 需求分析

21 固定红包

如果是固定红包,则算法是⼀条直线。t就是固定红包的额度。如图。

f(x) = t;(1 <= x <= num)

imagepng

22 随机红包

如果我们使⽤随机函数rand。rand(001,099);那么10次随机,如果最坏情况都是⾦额099,总⾦额就是99元。会超过5元。⾦额也会不正态分布。最后思考了⼀下借助与数学函数来当作随机红包的发⽣器,可以⽤抛物线,三⾓函数。最后选定了等腰三⾓线性函数。

第 2 页

1 算法原理

如果需要发红包总⾦额是totalMoney,红包个数是num个,⾦额范围是[min,max],线性⽅程如图。

imagepng

三个点的坐标:

(x1,y1) = (1,min)

(x2,y2) = (num/2,max)

(x3,y3) = (num,min)

确定的线性⽅程:

$y = 10 ($x - $x1) / ($x2 - $x1) ($y2 - $y1) + $y1 ; (x1 <= x <= x2)

第 3 页

$y = 10 ($x - $x2) / ($x3 - $x2) ($y3 - $y2) + $y2; (x2 <= x <= x3)

修数据:

y(合) = y1 + y2 + y3 + ynum;

y(合)有可能 > totalMoney ,说明⽣成⾦额多了,需要修数据,则从(y1,y2,y3ynum)这些每次减少001。直到y(合) = totalMoney。

y(合)有可能 < totalMoney ,说明⽣成⾦额少了,需要修数据,则从(y1,y2,y3ynum)这些每次加上001。直到y(合) = totalMoney。

第 4 页

2 算法原理样例

如果需要发红包总⾦额是11470,红包个数是7400个,⾦额范围是[001,309],线性⽅程如图。

imagepng

3 需求设计

31 类图设计

imagepng

32 源码设计

/

随机红包+固定红包算法[策略模式]

第 5 页

/

//配置传输数据DTO

class OptionDTO

{

//红包总⾦额

public $totalMoney;

//红包数量

public $num;

//范围开始

public $rangeStart;

第 6 页

//范围结算

public $rangeEnd;

//⽣成红包策略

public $builderStrategy;

//随机红包剩余规则

public $randFormatType; //Can_Left:不修数据,可以有剩余;No_Left:不能有剩余public static function create($totalMoney,$num,$rangeStart,$rangEnd, $builderStrategy,$randFormatType = 'No_Left')

第 7 页

{

$self = new self();

$self->num = $num;

$self->rangeStart = $rangeStart;

$self->rangeEnd = $rangEnd;

$self->totalMoney = $totalMoney;

$self->builderStrategy = $builderStrategy;

$self->randFormatType = $randFormatType;

return $self;

展开全文

App内免费读全文

前往文库APP签到领畅读卡,免费读微信红包随机数字全文

限免

导长图

转存到网盘

发送至微信

下载文档

北京百度网讯科技有限公司 版本号8070 隐私政策 权限说明

版权说明:本文档由用户提供并上传,收益专属归内容提供方,若内容存在侵权,请进行举报或认领

第 8 页

为您精选微信红包随机数字会员文档964篇

微信红包随机金额生成算法模拟及应用

2537人阅读

微信红包随机金额生成算法模拟及应用

1455人阅读

微信红包金额真的是随机分配的吗?

2391人阅读

微信红包算法分析及实现

2508人阅读

获取全部文档4326人在看

基于你的浏览为你整理资料合集

微信红包随机数字_微信随机红包数详解和算法代码

文件夹

微信红包规律分析 - 百度文库

36分

2906阅读

人气好文

五块五个包怎么猜红包尾数 - 百度文库

44分

1082阅读

微信红包随机金额生成算法模拟及应用 - 百度文库

40分

1491阅读

近期下载量飙升

剩余10篇精选文档

前往APP一键获取全部合集

相关文档

微信红包随机金额生成算法模拟及应用

免费获取全文

微信红包随机金额生成算法模拟及应用

免费获取全文

微信红包金额真的是随机分配的吗?

免费获取全文

微信红包算法分析及实现

免费获取全文

微信发红包数字含义大全课件doc

2567人已阅读

行业好评

微型计算机系统微机原理及应用试题库及答案(可编辑)

2060人已阅读

百里挑一

计算机网络系统投标书(技术部分)

1569人已阅读

网络安全设备-网闸[整理版]

1108人已阅读

ASP导出Excel数据的四种方法

2213人已阅读

学校开展网络安全教育活动方案

1822人已阅读

第3篇 综合应用篇 综合案例5 计算机网络应用综合案例

2470人已阅读

CPU针脚断了怎么焊接

1218人已阅读

数据结构顺序表的查找插入与删除

1594人已阅读

网络安全建设实施方案

1331人已阅读

网络安全检查自查表

1489人已阅读

查看更多

推荐文档集