他の人たちが赤い封筒を掴んでいる間、プログラマーたちは赤い封筒のアルゴリズムを研究している

他の人たちが赤い封筒を掴んでいる間、プログラマーたちは赤い封筒のアルゴリズムを研究している

羊年春節期間中のWeChat紅包の人気は明らかで、広告主は現金紅包に5億円を投入し、CCTVの羊年春節祝賀会との独占協力はイベントの宣伝に大きな役割を果たした。これは強壮剤のようなもので、短期間でWeChatに大きな注目とトラフィックをもたらしました。大晦日にWeChatユーザーが送った紅包の総数は10.1億回に達し、シェイクインタラクションの回数は110億回に達し、紅包の送信回数のピークは1分間に8.1億回に達した。

WeChat紅包の市場価値はさておき、紅包自体のアルゴリズムも白熱した議論を巻き起こしています。公式が明確な声明を出していないため、さまざまな意見があります。編集者も以下にいくつかの分析をお届けします。

まずはデータ分析の帝王を見てみましょう

ほとんどの人は独自の推測を行いますが、これは内部のランダム化アルゴリズムがわからない場合の唯一の選択肢ですが、ほとんどの人は独自の調査結果を提供しません。ここに 100 サンプルの調査サンプルデータがありますので、ご自身で推測してみてください。

1. ウォレット内の金額は、切り捨て正規乱数分布を満たします。大まかに言えば、切り捨て正規分布から乱数を取り出し、その合計を合計値で割って補正係数を取得し、次に補正係数をすべての乱数に掛けて赤い封筒の値を取得します。

この分布は、平均より低い赤い封筒は多いが、平均からそれほど離れていないこと、平均より高い赤い封筒は少ないが、平均よりもはるかに高い赤い封筒が多いことを意味しています。

図1. ウォレット値とその頻度分布ヒストグラムと正規分布

しかし、分布ヒストグラムを見ると、正規分布に準拠しているとは言えませんが、プログラムの単純さと乱数の合理性を考慮すると、これが最も合理的な推測です。

ウォレットが新しいほど、価値が高くなります。

図2. ウォレットのシーケンス番号とその値の関係を示す曲線

図 2 の線形フィッティングの赤い線から、ウォレット値の全体的な傾向はゆっくりと増加しており、その変化の範囲は緑の点線の上限と下限によって描かれた「チャネル」とほぼ一致していることがわかります。 (曲線がこのような従来の「チャネル」で囲まれるという事実は、ルール1の合理性を側面から反映しており、均一に分布した乱数ではないことを示しています)

このパターンは、平均値の別のグラフからも確認できます。

図3. シーケンス数に応じて変化する平均値の曲線

サンプルでは、​​価値が 1,000 のウォレットが平均 10 の 100 個の部分に分割されます。しかし、図 3 を見ると、最後のウォレットの前では平均値が常に 10 未満であったことがわかります。これは、最初のウォレットの価値が低く、より価値の高い後のウォレットの価値によって常に引き上げられたことを意味します。

3. もちろん、平均グラフは別のパターンも明らかにします。つまり、最も多くの抽選回数を獲得した人は幸運で、より多くの抽選を行うことが多いということです。最初の人は財布に残っているものをすべて取り、前の人全員の平均は 10 未満なので、少なくとも最初の人は平均を上回ることが保証されます。このサンプルでは、​​ウォレット 98 は 35 を引き、最後のウォレットは 46 を引きました。

要約すると、サンプルの推測に基づくと次のようになります。

1. ほとんどの場合、引き出す金額は他の人と同じですが、一度増えると、簡単にはるかに多くなる可能性があります。

2. 財布の後ろの方から引き出すほど、より多くのお金を取り出しやすくなります。

3. ***人にとって幸運を得るのは簡単なことであることが多い。

コメント: これは明らかに非常に実用的で、違いがあります。いつ手に取っても、数セントしかかかりません。

2人目の学生は簡単なPythonコードを書いた

赤い封筒の配布は、以下の点を満たしていることが確認されています。

1. お金に困る人はいない

2. 事前に配布されません

3. お金は大きく変動する

配布計画は、赤い封筒が最初に作成されたときに決定されます。赤い封筒をつかむと、封筒が一つずつ飛び出てきます。

したがって、Python コードは次のようになります。

  1. def weixin_divide_hongbao(お金, n):
  2. 分割表 = [random.randint( 1 , 10000 )xの範囲xrange( 0 , n)]
  3. sum_ = sum(divide_table)
  4. [ divide_table内のxに対してx*money/sum_を返す]

ただし、上記のアルゴリズムには 2 つの小さな問題があります。

1. 浮動小数点精度の問題

2. 境界値処理

3人目の学生は、インターネットで流通しているPythonバージョンに基づいてJavaバージョンを作成しました。

  1. 整数j = 1 ;
  2. 一方(j< 1000
  3. {
  4. 整数= 10 ;
  5. 浮動小数点合計 = 100 ;
  6. お金を浮かせる;
  7. ダブル最小値 = 0.01 ;
  8. ダブルマックス;
  9. 整数i = 1 ;
  10.  
  11. リストmath = new ArrayList();
  12. (i<数値)の場合
  13. {
  14.  
  15. 最大 = 合計- 最小*(数値- i);
  16. int k = ( int )((数値-i)/ 2 );
  17. if (数値 -i <= 2 )
  18. {k = 数値 -i;}
  19. 最大値 = 最大値/k;
  20. お金=( int )(min* 100 +Math.random()*(max* 100 -min* 100 + 1 ));
  21. お金=( float )お金/ 100 ;
  22. total=合計金額;
  23. math.add(お金);
  24. System.out.println( "その" +i+ "人が" +お金+ "残り" +合計を取得します);
  25. 私は++;
  26. if (i==数値)
  27. {
  28. math.add(合計);
  29. System.out.println( "その" +i+ "人は" +total+ "0 残り" );
  30. }
  31. }
  32.  
  33. System.out.println( "このラウンドで配布された赤い封筒の数" +(math.indexOf(Collections.max(math))+ 1 )+ "個人的な運***" );
  34. j++;
  35. }

4番目の学生が提案したアルゴリズムは非常に科学的であるように思われます。

彼はこう信じている。

1. 誰もが紅包を受け取れるようにする。

2. 各人が受け取った紅包の金額の合計 = 合計金額

3. 各人が受け取る紅包の数は異なりますが、あまりに違うとつまらないものになります。

4. アルゴリズムは単純でなければなりません。そうでなければ、Tencent の評判に応えられません。

正式なコーディングの前に、ルールを分析するための漸進的なモデルを構築する

合計金額を10元に設定すると、N人がランダムに受け取ります。

1 です

すると、紅包の金額はX元になります。

2倍

2番目の赤い封筒が正常に発送されるように、最初の赤い封筒の金額 = 0.01〜9.99の間の乱数

2 番目の赤いパケット = 10 - 最初の赤いパケットの金額;

3 倍

レッドパケット1 = 0.01から0.98の間の乱数

赤い封筒 2 = 0.01 から (10 - 赤い封筒 1 - 0.01) までの乱数

赤い封筒 3 = 10 - 赤い封筒 1 - 赤い封筒 2

  1. header("Content-Type: text/html; charset = utf -8"); // 出力は文字化けしていません。
  2. $ total = 10 ; //赤い封筒の合計金額
  3. $ num = 8 ; // 8つの赤い封筒に分け、8人がランダムに受け取れるようにする
  4. $ min = 0.01 ; // 一人当たり最低0.01元を受け取ることができます
  5.  
  6. ($ i = 1 ;$ i < $num;$ i++)の場合
  7. {
  8. $ safe_total =$total-($num-$i)*$min; //ランダムな安全上限
  9. $お金= mt_rand ($min*100,$safe_total*100)/100;
  10. $合計= $合計 - $お金;
  11. echo ''.$i.'番目の赤い封筒: '.$money.'元、残高: '.$total.'元< br /> ';
  12. }
  13. echo ''.$num.'番目の赤いパケット: '.$total.'元、残高: 0元';

入力してみると、変動が大きすぎてデータがつまらない!

最初の赤い封筒: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元

平均値をランダムな安全上限として使用してボラティリティを制御することで改善する

  1. header( "Content-Type: text/html; charset=utf-8" ); // 出力は文字化けしていません。  
  2. $total= 10 ; //赤い封筒の合計金額 
  3. $num= 8 ; // 8つの赤いパケットに分割し、8人がランダムに受け取ることをサポートします 
  4. $min= 0.01 ; // 誰もが少なくとも0.01元を受け取ることができます 
  5.  
  6. ($i= 1 ;$i<$num;$i++)の場合
  7. {
  8. $safe_total=($total-($num-$i)*$min)/($num-$i); //ランダムな安全上限 
  9. $money=mt_rand($min* 100 ,$safe_total* 100 )/ 100 ;
  10. $total=$total-$money;
  11. echo '' .$i. '番目の赤い封筒: ' .$money. '元、残高: ' .$total. '元 <br/>' ;
  12. }
  13. echo '' .$num. ' の赤いパケット: ' .$total. ' 元、残高: 0 元' ;

出力結果は下の図のようになります。

最初の赤い封筒: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元

まとめ:

編集者は、これは赤い封筒によって引き起こされた殺人として完全に理解できると考えています。編集者はほんの一部を挙げただけです。一部の工学部の学生は、数学モデル、離散関数などを直接投げ出しましたが、アルゴリズムが単純であろうと複雑であろうと、楽しむには十分です。

<<:  プログラマーが知っておくべき10の基本的な実用的なアルゴリズムとその説明

>>:  Jenkins 独自のユーザー データベース暗号化アルゴリズムの簡単な分析

推薦する

自動運転車の4つの重要な要素:2040年までに市場価値500億ドル

自動運転車は自動車業界にとって非常に破壊的な技術です。現在、多くのメーカーが物流、自動運転タクシー、...

UCLA Chineseが新しい自動演奏メカニズムを提案しました! LLMは自己学習し、その効果はGPT-4の専門家の指導よりも優れている

合成データは、大規模言語モデルの進化において最も重要な基礎となっています。昨年末、一部のネットユーザ...

...

フェイフェイ・リーがリストに載っています!バイデン氏、AI研究者にデータを公開するため12人からなるタスクフォースを設置

バイデン政権は木曜日、国家人工知能研究リソース(NAIRR)作業部会の設立を発表した。ワーキンググル...

AIと機械学習が建設業界にもたらす変化

建設業界は長い間、伝統的な手作業のプロセスで知られてきましたが、テクノロジーの進歩により急速に変化し...

...

微調整の必要はありませんか? 3つのサンプル、LLMアライメントを修正するための1つのヒント、エンジニアのヒント:すべて戻る

教師なしテキストコーパスのみで事前トレーニングされた基本的な大規模言語モデル (LLM) は、通常、...

一緒にハイキングに行きませんか? Baidu Brain EasyDLは、企業向けAI実装の山を登るお手伝いをします

エンタープライズ AI モデルの開発では、データの準備からモデルのトレーニング、サービスの展開まで、...

...

...

人工知能がデータセンターの需要を爆発的に増加させる

JLLの新しいレポートによると、人工知能の需要とクラウドサービスの継続的な導入により、データセンター...

AIの目に見えないマント:このパーカーを着ると監視アルゴリズムがあなたに目をつぶる

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

感情セグメンテーションを理解する: 機械学習を活用してポジティブな気持ちを維持する方法

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

AIの新たな方向性:敵対的攻撃

[[249559]]近年のAI分野を調査していく中で、近年、世界中の研究者の視野の中に敵対的攻撃とい...