Pythonで宝くじシステムを実装する方法

王林
リリース: 2023-05-11 09:16:05
転載
5415 人が閲覧しました

    1. 記事のトピック

    関連する宝くじ詐欺レポートを見ても、何が起こっているのか理解できない人もいます。宝くじに騙されないために、誰でも直感的に宝くじの裏に何が隠されているかが分かり、騙されないように、簡単な例を用いて宝くじの奥深いロジックを説明します。

    2. 宝くじの設計アイデア

    まず、各賞品の確率を決定し、その確率に基づいて抽選する簡単な宝くじロジックを実装しましょう。

    ステップ 1: 要件

    賞品のリストがあります。各賞には対応する確率があります。ユーザーは賞品を引いて、対応する確率で製品を入手します。

    ステップ 2: 賞品リストの作成

    上記の要件に従って、対応する賞品テーブルを作成します。確率は 1 ~ 100 から選択します。 0 ~ 1 を選択することもできます。

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    ログイン後にコピー
    ログイン後にコピー

    第 3 ステップ: 確率の実装

    これは基本的な宝くじロジックです。コード実装の難しさは主に確率です。確率を実装して当選賞金を獲得する方法賞。

    確率に関しては、random モジュールを使用する必要があります。つまり、乱数を使用する必要があります。ここでは 2 つの方法から選択します。

    #第一の方法: 区間で実現する
    抽選確率は区間を選択することで実現します. 抽選の確率はいくつかの区間に分割されており、それぞれの区間は当選間隔は乱数の範囲に基づいて決定されます。たとえば、宝くじの確率を次の間隔に分割できます:

    • - 間隔 1: 0% ~ 20%、賞金 A

    • に対応します。 ## - インターバル 2: 20% ~ 50%、賞品 B
    • - インターバル 3: 50% ~ 80%、賞品 C
    • # に対応##- 間隔 4: 80% ~ 100%、賞品 D
    • ユーザーが宝くじを引くとき、0 ~ 100 の乱数を生成し、当選を決定します。乱数の間隔に基づく賞品の数。たとえば、生成された乱数が 35 の場合、当選間隔は 2 となり、B 賞に対応します。
    利点: この方法で抽選確率を実現する利点は、各賞の当選確率を柔軟に制御でき、実際の状況に応じて調整できることです。

    欠点: 各賞品の当選確率の合計は 100% に等しくなければなりません。そうでない場合、宝くじの結果は不正確になります。

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖":10,"二等奖":20,"三等奖":30,"参与奖":40}
    #我们可以看做:
    # 一等奖:(0,10]
    # 二等奖:(10,30]
    # 三等奖:(30,60]
    # 参与奖:(60,100]
     
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(0,100)
        # 初始化区间值和奖品名称
        prob_sum_start = 0
        prob_sum_end = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加后一个区间值
            prob_sum_end += prob
            # 如果随机数在计算区间内,则中奖
            if prob_sum_start<lucky_number <= prob_sum_end:
                prize_name = name
                break
    # 累加前一个区间值
            prob_sum_start = prob
        #返回随机值和中奖产品
        return lucky_number,prize_name
    ログイン後にコピー

    2 番目のタイプ: 当選確率の累積による実装

    確率の累積を通じて宝くじを実装できます。まず、結果を示す 1 から 100 までの乱数を生成します。この宝くじの。
    次に、累積結果が乱数以上になるまで、結果が賞の確率に従って順番に累積されます。

    最後に蓄積が止まる賞品の確率が、この抽選で獲得した賞品となります。

    たとえば、乱数が 50 の場合、確率累積法により、

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    ログイン後にコピー
    ログイン後にコピー

    10<50 となり、1 等は当たりません

    10 20 = 30 < 50、2 等ではありません;

    10 20 30 = 60 >= 50、3 等です。

    したがって、この抽選で獲得した賞品は 3 番目の賞品です。

    利点: 賞品の確率を柔軟に調整して、さまざまな宝くじ効果を実現できます。この方法は複数の賞品にも適用でき、対応する確率に従って累積するだけでよく、理解しやすく、実装も簡単です。

    欠点: 欠点は、各賞の累積確率を計算する必要があり、賞の数が多い場合、計算量が大きくなる可能性があることです。

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
     
     
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
        print(lucky_number)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加概率总和
            prob_sum += prob
            # 如果随机数小于等于概率总和,则中奖
            if lucky_number <= prob_sum:
                prize_name = name
                break
        return prize_name
    ログイン後にコピー

    ステップ 4: 特別なメカニズムを追加する

    特定のアクティビティまたは特定の抽選に参加した後、私たちは常に誘惑に駆られ、高額な賞品に驚かされます。宝くじの仕組みとその解決方法がわかりません。これまでは、設定された当選確率に従って賞品を抽選することができましたが、今回は「騙される」ための仕組み、言い換えれば「手配」されるための特別な仕組みを追加する必要があります。

    1 つ目: 賞品を獲得したい人に賞品を獲得させる

    この方法は主にパーティーのいたずらの際に使用されます。誰もがこれに注意してください。この宝くじプログラムを誰が作成したかわからないため、オンラインでは行わないでください。
    この方法では、ホワイトリストを追加する必要があります。ホワイトリストに載っている人物と判断された場合は、指定された賞品を植えさせます。

    コードは次のとおりです:

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
    #白名单列表
    whitelist = ["Tom", "Jerry", "Lucy"]
    # 抽奖函数
    def lottery(white_user):
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
        print(lucky_number)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
        
        #判断在白名单内,中一等奖
        if white_user in whitelist:
            return "恭喜您中一等奖"
            # 遍历奖品列表
        else:
            for name, prob in prizes.items():
                # 累加概率总和
                prob_sum += prob
                # 如果随机数小于等于概率总和,则中奖
                if lucky_number <= prob_sum:
                    prize_name = name
                    break
        return prize_name
    ログイン後にコピー

    2 番目のタイプ: 宝くじに参加する前に別のアクティビティに参加できます

    このメソッド資格の検証が増えたり、ユーザー情報を取得した後でのみ抽選に参加できるようになったりする可能性があり、これはセキュリティ上の制限を追加するとみなされる可能性があります。
    ユーザーが別のアクティビティに参加するかログインすると、そのアクティビティに参加してアクティビティ プロセスに入ることができます。

    コードは次のとおりです。

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
    #已参加另外一个活动列表
    active_user = []
     
    #加法活动
    def addition(name):
        active_user.append(name)
        return name+"参加了活动"
     
     
    # 抽奖函数
    def lottery(name):
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
     
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 判断在白名单内,中一等奖
        if name not in active_user:
            return "很抱歉,您没有资格参与活动"
     
        else:
            # 遍历奖品列表
            for name, prob in prizes.items():
                # 累加概率总和
                prob_sum += prob
                # 如果随机数小于等于概率总和,则中奖
                if lucky_number <= prob_sum:
                    prize_name = name
                    break
        return prize_name
     
    #测试一下
    print(lottery("Tom"))#如果没有参与加法活动,来参与,无法抽奖
    print(addition("Tom"))#Tom先来参与加法活动再去参与活动
    print(lottery("Tom"))#参与活动抽奖
    ログイン後にコピー

    3 番目のタイプ: たとえ死ぬまで勝たせません

    これこの種の活動は純粋に嫌な人々によって行われていますが、参加しているユーザー全員はまったく知りませんし、全員がそれを自分たちの不運だと考えるでしょう。大賞はありますが、それを獲得することはできません。
    これは確率を使わず、結果を直接伝える、完全に彼のマーケティング手法です。

    コードは... ほど良くありません。その必要はありません。そのまま返してください。

    第四种:概率都是百分比,但是效果不一样

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是1-100,比例为百分比1-100的整数,但是当我们加上小数之后,就不一样。比如:

    1%和1.00%

    那现在这两种概率你觉得是一样的吗?

    答案肯定是不一样的,第一个是百分之一,第二个则是万分之一。因为第一个没有算小数,第二个还有两位小数,看似相等,其实已经变了。

    如下图:这三个箭头指向,所占比例大概就是80%,20%,当我们数据越多,范围就会越广,如果随机,那数据会更容易落到80%。

    抽奖概率正确性,我们其实可以从概率的统计定义中来看待。

    在一定条件下,重复做n次试验,nA为n次试验中事件A发生的次数,如果随着n逐渐增大,频率nA/n逐渐稳定在某一数值p附近,则数值p称为事件A在该条件下发生的概率。

    就是说数值越多,越是能证明概率的正确性。但是,我们抽奖只有一次机会。对于我来说80%肯定比20%更加容易随机。

    代码控制:控制随机值,1-10000。

    第五种:某荣耀-有机率

    有机率估计是某王常用套路了,有机率基本等于没有。文字游戏算是被玩明白了。当然因为用户体量比较大,因此,也可能采用第4种方式,万分之一,或者是百万分之一。

    第六种:保底机制

    这种机制就是比较明确的,整体意思就是,我已经做好坑你准备了,但是坑了我就收手,让你看到希望,给你大奖。常见的有抽了多少次,我就给你中什么奖品。

    这里我们设置保底机制为10次必中一等奖。如果前9次都没有中奖,第10次一定中一等奖。

    代码如下:

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 1, "二等奖": 2, "三等奖": 3, "参与奖": 94}
     
    lottery_num = 0  # 记录已经抽中的一等奖、二等奖、三等奖的次数
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        global lottery_num
        lucky_number = random.randint(1, 100)
        print(lucky_number,lottery_num)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加概率总和
            prob_sum += prob
            # 如果随机数小于等于概率总和,则中奖
            if lucky_number <= prob_sum:
                prize_name = name
                break
        if prize_name=="参与奖":
            lottery_num += 1
            if lottery_num == 10:
                return "恭喜你,中一等奖"
            return prize_name
        else:
            lottery_num=0
            return prize_name
     
    for i in range(10):
        print(lottery())
    ログイン後にコピー

    以上がPythonで宝くじシステムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート