首頁  >  文章  >  後端開發  >  Python怎麼實現抽獎系統

Python怎麼實現抽獎系統

王林
王林轉載
2023-05-11 09:16:055407瀏覽

    一、文章主題

    在看到相關的抽獎詐騙報道,有的人卻不懂是怎麼回事。為了預防被抽獎詐騙,因此,我們透過一些簡單的例子來說,抽獎更深層的邏輯,讓大家直觀的看到抽獎背後隱藏的東西,防止上當受騙。

    二、抽獎設計想法

    #首先,先來實現一個簡單的抽獎邏輯,我們需要確定每個獎品的機率,並根據機率進行抽出。

    第一步:需求

    有獎品清單。每一個獎品都有對應的機率。用戶抽獎獲得對應機率商品。

    第二步:建立獎品清單

    根據上面的要求,我們建立對應的獎品表,機率我們選用1-100的整數,當然也可以選擇0-1。

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

    第三步:機率實現

    這就是一個基礎的抽獎邏輯,程式碼實現難點主要是機率,如何去實現機率,能獲得抽中的獎品。

    關於機率我們需要使用到random模組,也就是我們需要使用到隨機數。這裡我這裡有兩種方式可供選擇。

    第一種:透過區間實現

    抽獎機率選用區間的方式實現,將抽獎的機率分成若干個區間,每個區間對應一個獎品,然後根據隨機數的範圍來決定中獎的區間。例如,我們可以將抽獎的機率分成以下幾個區間:

    • - 區間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
    第二種:透過獎品機率累加實現

    我們可以透過機率累加的方式來實現抽獎,首先產生一個1到100之間的隨機數,表示本次抽獎的結果。

    然後依照獎品的機率依序累加,直到累加的結果大於等於隨機數。

    最後停止累加的獎品機率即為本次抽獎中的獎品。

    例如,如果隨機數為50,則依照機率累積的方式,可以得到以下結果:

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

    106af1a90bd25da53145393ef633ae5a5b= 50,是三等獎。

    因此,本次抽獎中的獎品為三等獎。

    優點:可以靈活地調整獎品的機率,以達到不同的抽獎效果。這種方法也可以應用於多個獎品的情況,只需要按照對應的機率進行累加即可,簡單易懂、實現方便。

    缺點:缺點是需要計算每個獎品的累加機率,如果獎品數量較多,計算量可能較大。

    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

    第四步:增加特殊機制

    在我們參與某些活動,或某些抽獎之後,總是會被人引誘,被大獎沖昏頭腦,那抽獎機制是什麼,我們也不清楚,這可如何解決。前面我們可以讓每一個獎品按照設定的獎品機率進行抽獎,這時,我們需要增加一些特殊機制,這些機制就是被「詐騙」的機制,或者說,被「安排」的機制。

    第一種:想讓誰中獎,就讓誰中獎

    這種方式,主要用在聚會惡搞場合,大家可要注意了,這種就不要線上了,因為你不知道這個抽獎程式是誰寫的。

    針對這種方式,我們需要增加白名單。判斷如果是白名單內的人,那我們就讓他種指定獎品。

    程式碼如下:

    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
    第二種:參與了另一個活動,才可以來抽獎

    這種方式增加了資格的驗證,也可以是,有使用者資訊之後,才能參與抽獎,也算是增加了一些安全限制。

    如果使用者參與了另一個活動,或是登入了,才能參與活動,進入活動流程。

    程式碼如下:

    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"))#参与活动抽奖
    第三種:打死都不讓你中

    這種活動純純就是噁心人而做的,但是所有參加的用戶完全就是不知道,都會以為是自己的運氣差。大獎就在哪裡,就是拿不到。

    這都不用機率,直接給你出結果,完全就是他的行銷手段。

    程式碼如……不如了,都不需要,直接一個return搞定。

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

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是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中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除