Heim > Backend-Entwicklung > Python-Tutorial > So implementieren Sie ein Lotteriesystem in Python

So implementieren Sie ein Lotteriesystem in Python

王林
Freigeben: 2023-05-11 09:16:05
nach vorne
5475 Leute haben es durchsucht

    1. Artikelthema

    Nachdem sie relevante Lotteriebetrugsberichte gesehen haben, verstehen einige Leute nicht, was los ist. Um zu verhindern, dass man durch die Lotterie betrogen wird, erklären wir anhand einiger einfacher Beispiele die tiefere Logik der Lotterie, sodass jeder intuitiv erkennen kann, was sich hinter der Lotterie verbirgt, und einer Täuschung vorbeugen kann.

    2. Ideen für das Lotteriedesign

    Zuerst implementieren wir eine einfache Lotterielogik. Wir müssen die Wahrscheinlichkeit jedes Gewinns bestimmen und ihn basierend auf der Wahrscheinlichkeit ziehen.

    Schritt 1: Voraussetzungen

    Es gibt eine Liste mit Preisen. Jeder Preis hat eine entsprechende Wahrscheinlichkeit. Benutzer verlosen Preise, um Produkte mit entsprechenden Wahrscheinlichkeiten zu erhalten.

    Schritt 2: Gewinnliste erstellen

    Gemäß den oben genannten Anforderungen erstellen wir die entsprechende Gewinntabelle. Als Wahrscheinlichkeit wählen wir eine ganze Zahl von 1-100. Natürlich können Sie auch 0-1 wählen.

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    Nach dem Login kopieren
    Nach dem Login kopieren

    Schritt 3: Wahrscheinlichkeitsimplementierung

    Dies ist eine grundlegende Lotterielogik. Die Schwierigkeit bei der Codeimplementierung besteht hauptsächlich darin, wie man Wahrscheinlichkeiten implementiert und die Preise zieht.

    In Bezug auf die Wahrscheinlichkeit müssen wir das Zufallsmodul verwenden, was bedeutet, dass wir Zufallszahlen verwenden müssen. Hier habe ich zwei Möglichkeiten zur Auswahl.

    Die erste Methode: Implementierung durch Intervalle

    Die Lotteriewahrscheinlichkeit wird durch Intervalle implementiert. Die Wahrscheinlichkeit der Lotterie wird in mehrere Intervalle unterteilt, jedes Intervall entspricht einem Preis und dann wird das Gewinnintervall anhand des Bereichs bestimmt von Zufallszahlen. Zum Beispiel können wir die Wahrscheinlichkeit der Lotterie in die folgenden Intervalle einteilen:

    • - Intervall 1: 0 % ~ 20 %, entsprechend Preis A

    • - Intervall 2: 20 % ~ 50 %, entsprechend Preis B

    • - Intervall 3: 50 % ~ 80 %, entsprechend Preis C

    • - Intervall 4: 80 % ~ 100 %, entsprechend Preis D

    Wenn der Benutzer eine Lotterie zieht, wir kann einen Zufallszahlenwert zwischen 0 und 100 generieren und dann den Gewinnpreis basierend auf dem Intervall der Zufallszahl bestimmen. Wenn die generierte Zufallszahl beispielsweise 35 ist, beträgt das Gewinnintervall 2, was dem Preis B entspricht.

    Vorteile: Der Vorteil dieser Implementierung der Lotteriewahrscheinlichkeit besteht darin, dass die Gewinnwahrscheinlichkeit jedes Preises flexibel gesteuert und auch an die tatsächliche Situation angepasst werden kann.

    Nachteile: Die Summe der Gewinnwahrscheinlichkeiten jedes Preises muss 100 % betragen, sonst sind die Lotterieergebnisse ungenau.

    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
    Nach dem Login kopieren
    Zweitens: Realisiert durch Akkumulation von Gewinnwahrscheinlichkeiten

    Wir können die Lotterie durch Wahrscheinlichkeitsakkumulation umsetzen. Zunächst wird eine Zufallszahl zwischen 1 und 100 generiert, um das Ergebnis dieser Lotterie darzustellen.

    Dann werden die Belohnungen der Reihe nach entsprechend der Gewinnwahrscheinlichkeit akkumuliert, bis das akkumulierte Ergebnis größer oder gleich der Zufallszahl ist.

    Die letzte Gewinnwahrscheinlichkeit, die sich nicht mehr ansammelt, ist der bei dieser Verlosung gewonnene Preis.

    Wenn die Zufallszahl beispielsweise 50 ist, können gemäß der Wahrscheinlichkeitsakkumulationsmethode die folgenden Ergebnisse erhalten werden:

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    Nach dem Login kopieren
    Nach dem Login kopieren

    10< 50, nicht der erste Preis;

    10 + 20 = 30 < 50, nicht der zweite Preis;

    10 + 20 + 30 = 60 >= 50, was der dritte Preis ist.

    Der bei dieser Verlosung gewonnene Preis ist daher der dritte Preis.

    Vorteile: Die Gewinnwahrscheinlichkeit kann flexibel angepasst werden, um unterschiedliche Lotterieeffekte zu erzielen. Diese Methode kann auch auf mehrere Preise angewendet werden. Sie muss nur entsprechend der entsprechenden Wahrscheinlichkeit akkumuliert werden. Sie ist einfach zu verstehen und leicht umzusetzen.

    Nachteil: Der Nachteil besteht darin, dass die kumulative Wahrscheinlichkeit jedes Preises berechnet werden muss. Wenn die Anzahl der Preise groß ist, kann der Berechnungsbetrag groß sein.

    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
    Nach dem Login kopieren

    Schritt 4: Spezialmechanismus hinzufügen

    Nachdem wir an bestimmten Aktivitäten oder bestimmten Verlosungen teilgenommen haben, werden wir immer von den großen Preisen mitgerissen. Wir wissen nicht, was der Verlosungsmechanismus ist das lässt sich lösen. Zuvor konnten wir jeden Preis entsprechend der festgelegten Gewinnwahrscheinlichkeit ziehen lassen. Zu diesem Zeitpunkt müssen wir einige spezielle Mechanismen hinzufügen, um Mechanismen zum „Betrügen“ oder mit anderen Worten „Arrangieren“ zu verwenden.

    Die erste: Lass den Preis gewinnen, wen auch immer du willst

    Diese Methode wird hauptsächlich bei Party-Streich-Anlässen verwendet. Jeder sollte dies online tun, weil Sie es nicht tun Kennen Sie die Lotterie? Wer hat das Programm geschrieben?

    Für diese Methode müssen wir eine Whitelist hinzufügen. Wenn festgestellt wird, dass es sich um eine Person auf der Whitelist handelt, lassen wir sie den vorgesehenen Preis platzieren.

    Der Code lautet wie folgt:

    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
    Nach dem Login kopieren
    Der zweite Typ: Sie können an der Lotterie erst teilnehmen, nachdem Sie an einer anderen Aktivität teilgenommen haben

    Diese Methode fügt eine Überprüfung der Qualifikationen hinzu, oder Sie können erst nach Ihnen an der Lotterie teilnehmen Benutzerinformationen haben, die als einige Sicherheitseinschränkungen hinzugefügt werden.

    Wenn der Benutzer an einer anderen Aktivität teilnimmt oder sich anmeldet, kann er an der Aktivität teilnehmen und in den Aktivitätsprozess einsteigen.

    Der Code lautet wie folgt:

    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"))#参与活动抽奖
    Nach dem Login kopieren
    Der dritte Typ: Ich lasse dich nicht gewinnen, selbst wenn ich dich zu Tode schlage

    Diese Art von Aktivität wird ausschließlich von ekelhaften Leuten durchgeführt, aber alle teilnehmenden Benutzer haben es getan Ich habe überhaupt keine Ahnung und werde denken, es sei ihr eigenes Pech. Der Hauptpreis ist da, aber Sie können ihn nicht bekommen.

    Dies verwendet keine Wahrscheinlichkeiten und liefert Ihnen die Ergebnisse direkt. Dies ist ganz und gar seine Marketingmethode.

    Wenn der Code nicht so gut ist wie..., brauchen Sie ihn nicht, geben Sie ihn einfach zurück.

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

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是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())
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie ein Lotteriesystem in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage