Comment implémenter un système de loterie en Python

王林
Libérer: 2023-05-11 09:16:05
avant
5415 Les gens l'ont consulté

    1. Sujet de l'article

    Après avoir vu des rapports de fraude à la loterie pertinents, certaines personnes ne comprennent pas ce qui se passe. Afin d'éviter d'être fraudé par la loterie, nous utiliserons quelques exemples simples pour expliquer la logique profonde de la loterie, afin que chacun puisse voir intuitivement ce qui se cache derrière la loterie et éviter d'être trompé.

    2. Idées de conception de loterie

    Tout d'abord, implémentons une logique de loterie simple. Nous devons déterminer la probabilité de chaque prix et le tirer en fonction de cette probabilité.

    Étape 1 : Exigences

    Il y a une liste de prix. Chaque prix a une probabilité correspondante. Les utilisateurs dessinent des produits avec les probabilités correspondantes.

    Étape 2 : Créer une liste de prix

    Selon les exigences ci-dessus, nous créons le tableau des prix correspondant Pour la probabilité, nous choisissons un nombre entier de 1 à 100. Bien sûr, nous pouvons également choisir 0-1.

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    Copier après la connexion
    Copier après la connexion

    Étape 3 : Implémentation des probabilités

    Il s'agit d'une logique de loterie de base. La difficulté de l'implémentation du code est principalement la manière d'implémenter la probabilité et d'obtenir les prix tirés.

    Concernant les probabilités, nous devons utiliser le module aléatoire, ce qui signifie que nous devons utiliser des nombres aléatoires. Ici, j'ai deux façons de choisir.

    La première méthode : Implémentation par intervalles

    La probabilité de loterie est implémentée par intervalles. La probabilité de la loterie est divisée en plusieurs intervalles, chaque intervalle correspond à un prix, puis l'intervalle gagnant est déterminé en fonction de la plage. de nombres aléatoires. Par exemple, nous pouvons diviser la probabilité de la loterie dans les intervalles suivants :

    • - Intervalle 1 : 0%~20%, correspondant au prix A

    • - Intervalle 2 : 20%~50%, correspondant à prix B

    • - Intervalle 3 : 50%~80%, correspondant au prix C

    • - Intervalle 4 : 80%~100%, correspondant au prix D

    Lorsque l'utilisateur tire à la loterie, nous peut générer une valeur comprise entre 0 et 100 nombres aléatoires, puis déterminer le prix gagnant en fonction de l'intervalle du nombre aléatoire. Par exemple, si le nombre aléatoire généré est 35, alors l'intervalle de gain sera de 2, correspondant au prix B.

    Avantages : L'avantage de mettre en œuvre la probabilité de loterie de cette manière est que la probabilité de gagner de chaque prix peut être contrôlée de manière flexible, et elle peut également être ajustée en fonction de la situation réelle.

    Inconvénients : La somme des probabilités de gain de chaque prix doit être égale à 100%, sinon les résultats de la loterie seront inexacts.

    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
    Copier après la connexion
    Deuxième : réalisé grâce à l'accumulation de probabilités de prix

    Nous pouvons mettre en œuvre la loterie par accumulation de probabilités. Premièrement, un nombre aléatoire entre 1 et 100 est généré pour représenter le résultat de cette loterie.

    Ensuite, les récompenses sont accumulées dans l'ordre en fonction de la probabilité de remporter le prix, jusqu'à ce que le résultat accumulé soit supérieur ou égal au nombre aléatoire.

    La dernière probabilité de prix qui cesse de s'accumuler est le prix gagné lors de ce tirage.

    Par exemple, si le nombre aléatoire est 50, selon la méthode d'accumulation de probabilité, les résultats suivants peuvent être obtenus :

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }
    Copier après la connexion
    Copier après la connexion

    10< 50, pas le premier prix ;

    10 + 20 = 30 < le deuxième prix ;

    10 + 20 + 30 = 60 >= 50, qui est le troisième prix.

    Par conséquent, le prix remporté lors de ce tirage au sort est le troisième prix.

    Avantages : la probabilité de gagner des prix peut être ajustée de manière flexible pour obtenir différents effets de loterie. Cette méthode peut également être appliquée à plusieurs prix. Il suffit de l'accumuler en fonction de la probabilité correspondante. Elle est simple à comprendre et à mettre en œuvre.

    Inconvénient : L'inconvénient est que la probabilité cumulée de chaque prix doit être calculée. Si le nombre de prix est important, le montant du calcul peut être important.

    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
    Copier après la connexion

    Étape 4 : Ajouter un mécanisme spécial

    Après avoir participé à certaines activités ou certains tirages, nous serons toujours tentés et emportés par les gros prix. Nous ne savons pas quel est le mécanisme de tirage, comment. cela peut être résolu. Auparavant, nous pouvions laisser chaque prix être tiré selon la probabilité de gain définie. À ce stade, nous devons ajouter des mécanismes spéciaux. Ces mécanismes sont des mécanismes permettant d'être « arnaqué », ou en d'autres termes, des mécanismes permettant d'être « arrangé ».

    La première : laissez celui que vous voulez gagner le prix, laissez-le gagner le prix

    Cette méthode est principalement utilisée lors des farces de fête. Tout le monde devrait faire attention en ligne parce que vous ne le faites pas. connaître la loterie. Qui a écrit le programme.

    Pour cette méthode, nous devons ajouter une liste blanche. S'il s'agit d'une personne figurant sur la liste blanche, nous la laisserons planter le prix désigné.

    Le code est le suivant :

    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
    Copier après la connexion
    Le deuxième type : vous ne pouvez participer à la loterie qu'après avoir participé à une autre activité

    Cette méthode ajoute une vérification des qualifications, ou vous ne pouvez participer à la loterie qu'après avoir avoir des informations utilisateur, qui sont considérées comme ajoutées à certaines restrictions de sécurité.

    Si l'utilisateur participe à une autre activité ou se connecte, il peut participer à l'activité et entrer dans le processus d'activité.

    Le code est le suivant :

    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"))#参与活动抽奖
    Copier après la connexion
    Le troisième type : je ne te laisserai pas gagner même si je te bats à mort

    Ce genre d'activité est purement réalisé par des gens dégoûtants, mais tous les utilisateurs participants ont aucune idée du tout et penseront que c'est leur propre malchance. Le grand prix est là, mais vous ne pouvez pas l’obtenir.

    Cela n'utilise pas de probabilités et vous donne directement les résultats. C'est tout à fait sa méthode de marketing.

    Si le code n'est pas aussi bon que..., vous n'en avez pas besoin, retournez-le simplement.

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

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是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())
    Copier après la connexion

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal