ホームページ バックエンド開発 PHPチュートリアル 大家在抢红包,程序员在研究红包算法_PHP

大家在抢红包,程序员在研究红包算法_PHP

May 30, 2016 am 08:44 AM
WeChatの赤い封筒

除夕全天微信用户红包总发送量达到10.1亿次,摇一摇互动量达到110亿次,红包峰值发送量为8.1亿次/分钟。

抛开微信红包的市场价值不谈,红包本身的算法也引发了热议,由于官方没有给出明确的说法,各家也是众说纷纭,小编下面也为大家带来几种分析。

首先看看数据分析帝

大多数人都做出自己的猜测,这也是在不知道内部随机算法的时候的唯一选择,但是大多数人没有给出自己亲自的调查结果。这里给出一份100样本的调查抽样样本数据,并提出自己的猜测。

1. 钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。

这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包偏多。


图1. 钱包价值与其频率分布直方图及其正态拟合

但看分布直方图并不能推出它符合正态分布,但是考虑到程序的简洁性和随机数的合理性,这是最合乎情理的一种猜测。
越是后面的钱包,价值普遍更高


图2. 钱包序列数与其价值关系曲线

从图2中的线性拟合红线可以看到,钱包价值的总体变化趋势是在慢慢增大,其变化范围大约是一个绿色虚线上下界划出的“通道”。(曲线可以被围在这么一个正合乎常规的“通道”中,也从侧面反映了规律1的合理性,说明了并不是均匀分布的随机数)
从另一个平均数的图中也可以看出这一规律。


图3. 平均数随序列数的变化曲线

在样本中,1000价值的钱包被分成100份,均值为10。然而在图3中我们可以看到在最后一个钱包之前,平均数一直低于10,这就说明了一开始的钱包价值偏低,一直被后期的钱包价值拉着往上走,后期的钱包价值更高。

3. 当然平均数的图还可以透露出另一个规律,那就是最后的那一个人往往容易走运抽得比较多。因为最后那一个人是钱包剩下多少就拿多少的,而之前所有人的平均数 都低于10,所以至少保证了最后一个人会高于平均值。在本样本中,98号钱包抽到35,而最后一份钱包抽到46。

综上,根据样本猜测:


1. 抽到的钱大多数时候跟别人一样少,但一旦一多,就容易多很多。
2. 越是抽后面的钱包,钱越容易多。
3. 最后一个人往往容易撞大运。

点评:这种明显很实际有差异,小编每次不管什么时候抢都是几毛钱。

第二位同学写了一个简单python 代码

据观察,红包分钱满足以下几点:

1.不会有人拿不到钱

2.不会提前分完

3.钱的波动范围很大

红包在一开始创建的时候,分配方案就订好了。抢红包的时候,不过是挨个pop up而已。

因此 python 代码如下:

def weixin_divide_hongbao(money, n): 
divide_table = [random.randint(1, 10000)
for x in xrange(0, n)] 
sum_ = sum(divide_table) 
return [x*money/sum_ for x in divide_table] 
ログイン後にコピー

不过上述算法还有两个小问题:

1.浮点数精度问题

2.边界值的处理

第三位同学按照网上流传的python写了一个java的版本

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
}
ログイン後にコピー
ログイン後にコピー

第四位同学的这种算法看起来非常科学。

他认为:

1、每个人都要能够领取到红包;

2、每个人领取到的红包金额总和=总金额;

3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;

4、算法一定要简单,不然对不起腾讯这个招牌;

正式编码之前,先搭建一个递进的模型来分析规律

设定总金额为10元,有N个人随机领取:

N=1

则红包金额=X元;

N=2

为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数

第二个红包=10-第一个红包金额;

N=3

红包1=0.01至0.98之间的某个随机数

红包2=0.01至(10-红包1-0.01)的某个随机数

红包3=10-红包1-红包2

……

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
} 
ログイン後にコピー

输入一看,波动太大,这数据太无趣了!

第1个红包:7.48 元,余额:2.52 元

第2个红包:1.9 元,余额:0.62 元

第3个红包:0.49 元,余额:0.13 元

第4个红包:0.04 元,余额:0.09 元

第5个红包:0.03 元,余额:0.06 元

第6个红包:0.03 元,余额:0.03 元

第7个红包:0.01 元,余额:0.02 元

第8个红包:0.02 元,余额:0 元

改良一下,将平均值作为随机安全上限来控制波动差

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
}
ログイン後にコピー
ログイン後にコピー

输出结果见下图

第1个红包:0.06 元,余额:9.94 元

第2个红包:1.55 元,余额:8.39 元

第3个红包:0.25 元,余额:8.14 元

第4个红包:0.98 元,余额:7.16 元

第5个红包:1.88 元,余额:5.28 元

第6个红包:1.92 元,余额:3.36 元

第7个红包:2.98 元,余额:0.38 元

第8个红包:0.38 元,余额:0 元

小结:

小编觉得这完全可以理解成一个红包引发的血案,小编仅仅列举了几个,还有一些工程学的同学直接抛出了数学模型、离散函数等等,但是无论算法是简单还是复杂,玩的开心就够了。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

送信できる WeChat 赤い封筒の最大量はいくらですか? 送信できる WeChat 赤い封筒の最大量はいくらですか? Feb 23, 2024 pm 04:40 PM

送信できる WeChat 赤い封筒の最大量はいくらですか? WeChatで送信できる赤い封筒の量には上限があり、一部のユーザーはWeChatで送信できる赤い封筒の最大量について明確にしていません。特別日以外の最大金額は 200 です。次に、編集者がユーザーに提供する赤い封筒の最大数について紹介しますので、興味のあるユーザーは見に来てください。 WeChat 使い方チュートリアル WeChat ステータス背景画像の設定方法 答え: 200 元 詳細: 1. WeChat 紅包金額の上限: 200。 WeChat 紅包で送金できるのは 1 人あたり最大 200 元までです。 2.特別紅包金額:毎年5月20日、ユーザーは520元を上限として紅包を送ることができます。

WeChat の赤い封筒を返送する方法 WeChat の赤い封筒を拒否し、すぐに相手に返送する方法は何ですか? WeChat の赤い封筒を返送する方法 WeChat の赤い封筒を拒否し、すぐに相手に返送する方法は何ですか? Feb 22, 2024 pm 04:43 PM

現在の WeChat 赤い封筒は手動返信をサポートしていません。チュートリアル 適用モデル: iPhone13 システム: iOS15.5 バージョン: WeChat 8.0.19 分析 1 現在の WeChat 赤い封筒は手動返却をサポートしていません. まだ請求されていない WeChat 赤い封筒については、WeChat システムは自動的に元のアカウントに返却します赤い封筒を受け取った後に返却したい場合は、当社が受け取りを拒否しない限り、24時間後に自動的に返却されます。補足: WeChat 転送の返送方法 1 WeChat チャット インターフェイスで、返送する必要がある転送をクリックします。 2転送の詳細インターフェイスで、返金オプションをクリックします。 3. 表示される新しいポップアップ ウィンドウで、もう一度 [戻る] をクリックします。要約/注意事項: 現在の WeChat の赤い封筒は手動での返送をサポートしていません。赤い封筒を受け取った場合、受け取らない限り、24 時間後に返送されます。

WeChat 赤い封筒を返送するための詳細な手順 WeChat 赤い封筒を返送するための詳細な手順 Mar 25, 2024 am 11:21 AM

1. WeChat アプレットを見つけます。 2. クリックして [Tencent Report Acceptance Center] を検索します。 3. インターネット詐欺のオプションをクリックします。 4. 関連情報とスクリーンショットを入力します。 WeChat 赤い封筒の手順: 1. WeChat 赤い封筒が 24 時間以内に回収されない場合、直接返送されます。 2. WeChat の赤い封筒は他人が収集したものであり、お客様が返却することはできません。

WeChatの赤い封筒を返送するにはどうすればよいですか? WeChatの赤い封筒の返送に対処する方法 WeChatの赤い封筒を返送するにはどうすればよいですか? WeChatの赤い封筒の返送に対処する方法 Mar 12, 2024 pm 05:00 PM

WeChatはソーシャルネットワーキング、決済、ショッピングなどの機能を統合したモバイルアプリケーションで、ユーザーに深く愛されています。中でも、支払い機能の一部である WeChat 紅包は、その便利さと楽しさで大多数のユーザーの支持を得ています。ただし、場合によっては、間違った赤い封筒が送られてくるという状況に遭遇することがあります。 WeChat紅包の返送は面倒な場合もありますが、WeChat紅包を使用する際は、送信内容が正確であることを必ずよく確認してください。 WeChatの赤い封筒を返送するにはどうすればよいですか? WeChat 紅封筒の返送の処理方法 WeChat 紅封筒の返送方法は、主に紅封筒が受け取られたかどうかによって異なります。赤い封筒が届かない場合、次のような対処方法があります。 ケース 1 の場合、相手が赤い封筒を受け取っていない場合は、相手に直接連絡し、間違った赤い封筒を送ったことを伝えます。そして相手に受け取らないようお願いします。 24時間以上

WeChat紅封筒のリマインダーを設定する具体的な方法 WeChat紅封筒のリマインダーを設定する具体的な方法 Mar 25, 2024 pm 05:46 PM

1. Tencent Butler をダウンロードします。 2. Tencent Mobile Butler を見つけます: [ユーティリティ] - [その他]。 3. [赤い封筒の目覚まし時計]をクリックします。 4. WeChat と QQ のオプションが表示されたら、下のボタン 1 つをクリックして開きます。 5. 開いたインターフェイスが表示されるか、右上隅の設定ボタンをクリックして設定できます。 6. サウンドリマインダーまたはバイブレーションリマインダーを選択し、それらをすべて設定できます。

WeChatの赤い封筒の通知音を設定するにはどうすればよいですか? WeChatの赤い封筒のプロンプト音を設定する方法 WeChatの赤い封筒の通知音を設定するにはどうすればよいですか? WeChatの赤い封筒のプロンプト音を設定する方法 Mar 13, 2024 am 11:30 AM

WeChat は機能豊富なソーシャル アプリケーションであり、人々に便利なコミュニケーション手段を提供するだけでなく、独自の赤い封筒機能を通じてさらに楽しみを加えます。 WeChat の赤い封筒の通知音を設定すると、ユーザーは赤い封筒を受け取ったときにすぐに知ることができ、期待と驚きが加わります。 WeChat の赤い封筒のリマインダー音を設定すると、赤い封筒を受け取るたびに期待と楽しみがいっぱいになります。 WeChat紅包通知音の設定方法は主に携帯電話システムとWeChatのバージョンによって異なります。 Android と Apple システムのセットアップ手順を見てみましょう。 WeChatの赤い封筒の通知音を設定するにはどうすればよいですか? WeChat の赤い封筒のプロンプト音を設定する方法 1. Android システムの場合、1. WeChat アプリケーションを開き、下部のナビゲーション バーの [自分] オプションをクリックし、[自分] ページに入り、[設定] をクリックします。 2. 設定ページで

WeChatの赤い封筒を相手に返送する際のメッセージを詳しく解説 WeChatの赤い封筒を相手に返送する際のメッセージを詳しく解説 Mar 25, 2024 pm 05:51 PM

1. まず、WeChat を開き、検索ボックスをクリックします。 2. WeChat Pay を検索します。 3. クリックして入力します。 4. 両当事者には、ここで WeChat 赤い封筒の返金プロンプトが表示されます。

WeChat で送信できる赤い封筒の最大数は何枚ですか? WeChat で送信できる赤い封筒の最大数は何枚ですか? Aug 17, 2023 pm 01:48 PM

WeChat では最大 200 枚の赤い封筒を送信できます。詳細: 各ユーザーに 1 日に送信される赤い封筒の合計額は 1,000 元を超えることはできません。いくつかの制限はありますが、WeChat 紅包は依然として非常に便利で人気のある支払い方法です。春節であろうと、その他の特別な行事であろうと、WeChat の赤い封筒は人々にさらなる楽しみと驚きをもたらします。

See all articles