WeChatの赤い包絡線グラブアルゴリズムの設計方法

          中国の旧正月には、WeChatグループの全員が赤い封筒を手に入れます。それを手に入れるのは楽しいことです。たくさん手に入れると、驚き、笑うでしょう。いくつかを手に入れると、もう一度後悔します。しかし、誰もが赤い封筒をつかむのは公平です。赤い封筒をつかむたびにランダムですか?

ここに画像の説明を挿入

今日は、この赤いエンベロープグラブアルゴリズムがどのように実装されているかを見てみましょう。赤い封筒をつかむには、いくつかのルールを満たす必要があります。

1.
全員がつかむ量の合計は、赤い封筒の量と等しくなければなりません2.誰もがお金をつかみます
3.赤い封筒の分割量が、1人がつかむのではなく、できるだけ均等に分配されるようにします99元と他の人が1ドルをつかみ、ハンマーで遊ぶ

          ここではアルゴリズムについてのみ説明します。同時実行性が高いために発生する問題に関係なく、受信時に各人が受信した赤い封筒の量を計算することはできません。各赤い封筒の量を計算してキューに入れる必要があります。 。キューで自分の共有を見つけます。
          各人がつかむ赤い封筒の量が平均であることを確認する方法は、二重平均法です。赤い封筒の残りの量がm元で、残りの人の数がnであると仮定すると、次の式になります。

毎回取得する量=ランダム間隔[0.01、m / n * 2-0.01]
この式は、各ランダム量の平均値が等しく、赤い封筒を取得する順序が不公平を引き起こさないことを保証します。

コード:

import random

def divide_red_package(total_amount,total_people_num):
    amount_list = []
    rest_amount = total_amount
    rest_people_num = total_people_num
    for i in range(0,total_people_num-1):
        amount = random.randint(1,int(rest_amount/rest_people_num*2)-1)
        rest_amount -= amount
        rest_people_num -= 1
        amount_list.append(amount)
    amount_list.append(rest_amount)
    return amount_list

my_amount_list = divide_red_package(100, 6)
for user,my_amount in enumerate(my_amount_list):
    print(f"第{user+1}个人抢到{my_amount}元")

結果:

1人目は3元、
2人目は16元、
3人目は5元、
4人目は9元、
5人目は35元、
6人目は32元を取得します。

        より理解しやすく興味深いPythonの知識をすべての人に共有してみてください!私のWeChatパブリックアカウントに注目してください。NingTsaiがPythonについて語っています。これにより、学習が楽しく興味深いものになります。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_43697214/article/details/108726891