亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路

 更新時(shí)間:2023年03月28日 09:17:16   作者:大家一起學(xué)編程(python)  
這篇文章主要介紹了Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路,本文通過一些簡(jiǎn)單的例子來說一說抽獎(jiǎng)系統(tǒng)背后的邏輯,看看究竟是你運(yùn)氣不好還是系統(tǒng)邏輯在作怪,需要的朋友可以參考下

一、文章主題

在看到相關(guān)的抽獎(jiǎng)詐騙報(bào)道,有的人卻不明白是怎么回事。為了預(yù)防被抽獎(jiǎng)詐騙,因此,我們通過一些簡(jiǎn)單的例子來說一說,抽獎(jiǎng)更深層的邏輯,讓大家直觀的看到抽獎(jiǎng)背后隱藏的東西,防止上當(dāng)受騙。

二、抽獎(jiǎng)設(shè)計(jì)思路

首先,先來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的抽獎(jiǎng)邏輯,我們需要確定每個(gè)獎(jiǎng)品的概率,并根據(jù)概率進(jìn)行抽取。

第一步:需求

有獎(jiǎng)品列表。每一個(gè)獎(jiǎng)品都有對(duì)應(yīng)的概率。用戶抽獎(jiǎng)獲得對(duì)應(yīng)概率商品。

第二步:建立獎(jiǎng)品列表

根據(jù)上面的要求,我們建立對(duì)應(yīng)的獎(jiǎng)品表,概率我們選用1-100的整數(shù),當(dāng)然也可以選擇0-1。

# 獎(jiǎng)品列表和對(duì)應(yīng)的概率,和為100
prizes = {"一等獎(jiǎng)": 10,"二等獎(jiǎng)": 20,"三等獎(jiǎng)": 30,"參與獎(jiǎng)": 40 }

第三步:概率實(shí)現(xiàn)

這就是一個(gè)基礎(chǔ)的抽獎(jiǎng)邏輯,代碼實(shí)現(xiàn)難點(diǎn)主要是概率,如何去實(shí)現(xiàn)概率,能獲得抽中的獎(jiǎng)品。

關(guān)于概率我們需要使用到random模塊,也就是我們需要使用到隨機(jī)數(shù)。這里我這里有兩種方式可供選擇。

第一種:通過區(qū)間實(shí)現(xiàn)

抽獎(jiǎng)概率選用區(qū)間的方式實(shí)現(xiàn),將抽獎(jiǎng)的概率分成若干個(gè)區(qū)間,每個(gè)區(qū)間對(duì)應(yīng)一個(gè)獎(jiǎng)品,然后根據(jù)隨機(jī)數(shù)的范圍來確定中獎(jiǎng)的區(qū)間。例如,我們可以將抽獎(jiǎng)的概率分成以下幾個(gè)區(qū)間:

  • - 區(qū)間1:0%~20%,對(duì)應(yīng)獎(jiǎng)品A
  • - 區(qū)間2:20%~50%,對(duì)應(yīng)獎(jiǎng)品B
  • - 區(qū)間3:50%~80%,對(duì)應(yīng)獎(jiǎng)品C
  • - 區(qū)間4:80%~100%,對(duì)應(yīng)獎(jiǎng)品D

當(dāng)用戶抽獎(jiǎng)時(shí),我們可以生成一個(gè)0~100之間的隨機(jī)數(shù),然后根據(jù)隨機(jī)數(shù)所在的區(qū)間來確定中獎(jiǎng)的獎(jiǎng)品。例如,如果生成的隨機(jī)數(shù)是35,那么就會(huì)中獎(jiǎng)區(qū)間2,對(duì)應(yīng)獎(jiǎng)品B。

優(yōu)點(diǎn):這種方式實(shí)現(xiàn)抽獎(jiǎng)概率的好處是可以靈活地控制各個(gè)獎(jiǎng)品的中獎(jiǎng)概率,同時(shí)也可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。

缺點(diǎn):各個(gè)獎(jiǎng)品的中獎(jiǎng)概率之和必須等于100%,否則會(huì)導(dǎo)致抽獎(jiǎng)結(jié)果不準(zhǔn)確。

import random
 
# 獎(jiǎng)品列表和對(duì)應(yīng)的概率
prizes = {"一等獎(jiǎng)":10,"二等獎(jiǎng)":20,"三等獎(jiǎng)":30,"參與獎(jiǎng)":40}
#我們可以看做:
# 一等獎(jiǎng):(0,10]
# 二等獎(jiǎng):(10,30]
# 三等獎(jiǎng):(30,60]
# 參與獎(jiǎng):(60,100]
 
# 抽獎(jiǎng)函數(shù)
def lottery():
    # 生成一個(gè)1~100之間的隨機(jī)數(shù)
    lucky_number = random.randint(0,100)
    # 初始化區(qū)間值和獎(jiǎng)品名稱
    prob_sum_start = 0
    prob_sum_end = 0
    prize_name = None
 
    # 遍歷獎(jiǎng)品列表
    for name, prob in prizes.items():
        # 累加后一個(gè)區(qū)間值
        prob_sum_end += prob
        # 如果隨機(jī)數(shù)在計(jì)算區(qū)間內(nèi),則中獎(jiǎng)
        if prob_sum_start<lucky_number <= prob_sum_end:
            prize_name = name
            break
# 累加前一個(gè)區(qū)間值
        prob_sum_start = prob
    #返回隨機(jī)值和中獎(jiǎng)產(chǎn)品
    return lucky_number,prize_name

第二種:通過獎(jiǎng)品概率累加實(shí)現(xiàn)

我們可以通過概率累加的方式來實(shí)現(xiàn)抽獎(jiǎng),首先生成一個(gè)1到100之間的隨機(jī)數(shù),表示本次抽獎(jiǎng)的結(jié)果。

然后按照獎(jiǎng)品的概率依次累加,直到累加的結(jié)果大于等于隨機(jī)數(shù)為止。

最后停止累加的獎(jiǎng)品概率即為本次抽中的獎(jiǎng)品。

例如,如果隨機(jī)數(shù)為50,則按照概率累加的方式,可以得到以下結(jié)果:

# 獎(jiǎng)品列表和對(duì)應(yīng)的概率,和為100
prizes = {"一等獎(jiǎng)": 10,"二等獎(jiǎng)": 20,"三等獎(jiǎng)": 30,"參與獎(jiǎng)": 40 }

10< 50,不是一等獎(jiǎng);

10 + 20 = 30 < 50,不是二等獎(jiǎng);

10 + 20 + 30 = 60 >= 50,是三等獎(jiǎng)。

因此,本次抽中的獎(jiǎng)品為三等獎(jiǎng)。

優(yōu)點(diǎn):可以靈活地調(diào)整獎(jiǎng)品的概率,以達(dá)到不同的抽獎(jiǎng)效果。這種方法也可以應(yīng)用于多個(gè)獎(jiǎng)品的情況,只需要按照相應(yīng)的概率進(jìn)行累加即可,簡(jiǎn)單易懂、實(shí)現(xiàn)方便。

缺點(diǎn):缺點(diǎn)是需要計(jì)算每個(gè)獎(jiǎng)品的累加概率,如果獎(jiǎng)品數(shù)量較多,計(jì)算量可能較大。

import random
 
# 獎(jiǎng)品列表和對(duì)應(yīng)的概率
prizes = {"一等獎(jiǎng)": 10, "二等獎(jiǎng)": 20, "三等獎(jiǎng)": 30, "參與獎(jiǎng)": 40}
 
 
# 抽獎(jiǎng)函數(shù)
def lottery():
    # 生成一個(gè)1~100之間的隨機(jī)數(shù)
    lucky_number = random.randint(1, 100)
    print(lucky_number)
    # 初始化概率總和和獎(jiǎng)品名稱
    prob_sum = 0
    prize_name = None
 
    # 遍歷獎(jiǎng)品列表
    for name, prob in prizes.items():
        # 累加概率總和
        prob_sum += prob
        # 如果隨機(jī)數(shù)小于等于概率總和,則中獎(jiǎng)
        if lucky_number <= prob_sum:
            prize_name = name
            break
    return prize_name

第四步:增加特殊機(jī)制

在我們參與某些活動(dòng),或者某些抽獎(jiǎng)之后,總是會(huì)被人引誘,被大獎(jiǎng)沖昏頭腦,那抽獎(jiǎng)機(jī)制是什么,我們也不清楚,這可如何解決。前面我們可以讓每一個(gè)獎(jiǎng)品按照設(shè)置的獎(jiǎng)品概率進(jìn)行抽獎(jiǎng),這時(shí),我們需要增加一些特殊機(jī)制,這些機(jī)制就是被“詐騙”的機(jī)制,或者說,被“安排”的機(jī)制。

第一種:想讓誰中獎(jiǎng),就讓誰中獎(jiǎng)

這種方式,主要用在聚會(huì)惡搞場(chǎng)合,大家可要注意了,這種就不要線上了,因?yàn)槟悴恢肋@個(gè)抽獎(jiǎng)程序是誰寫的。

針對(duì)這種方式,我們需要增加白名單。判斷如果是白名單內(nèi)的人,那我們就讓他種指定獎(jiǎng)品。

代碼如下:

import random
 
# 獎(jiǎng)品列表和對(duì)應(yīng)的概率
prizes = {"一等獎(jiǎng)": 10, "二等獎(jiǎng)": 20, "三等獎(jiǎng)": 30, "參與獎(jiǎng)": 40}
#白名單列表
whitelist = ["Tom", "Jerry", "Lucy"]
# 抽獎(jiǎng)函數(shù)
def lottery(white_user):
    # 生成一個(gè)1~100之間的隨機(jī)數(shù)
    lucky_number = random.randint(1, 100)
    print(lucky_number)
    # 初始化概率總和和獎(jiǎng)品名稱
    prob_sum = 0
    prize_name = None
    
    #判斷在白名單內(nèi),中一等獎(jiǎng)
    if white_user in whitelist:
        return "恭喜您中一等獎(jiǎng)"
        # 遍歷獎(jiǎng)品列表
    else:
        for name, prob in prizes.items():
            # 累加概率總和
            prob_sum += prob
            # 如果隨機(jī)數(shù)小于等于概率總和,則中獎(jiǎng)
            if lucky_number <= prob_sum:
                prize_name = name
                break
    return prize_name

第二種:參與了另外一個(gè)活動(dòng),才可以來抽獎(jiǎng)

這種方式增加了資格的驗(yàn)證,也可以是,有用戶信息之后,才能參與抽獎(jiǎng),也算是增加了一些安全限制。

如果用戶參與了另外一個(gè)活動(dòng),或者是登錄了,才能參與活動(dòng),進(jìn)入活動(dòng)流程。

代碼如下:

import random
 
# 獎(jiǎng)品列表和對(duì)應(yīng)的概率
prizes = {"一等獎(jiǎng)": 10, "二等獎(jiǎng)": 20, "三等獎(jiǎng)": 30, "參與獎(jiǎng)": 40}
#已參加另外一個(gè)活動(dòng)列表
active_user = []
 
#加法活動(dòng)
def addition(name):
    active_user.append(name)
    return name+"參加了活動(dòng)"
 
 
# 抽獎(jiǎng)函數(shù)
def lottery(name):
    # 生成一個(gè)1~100之間的隨機(jī)數(shù)
    lucky_number = random.randint(1, 100)
 
    # 初始化概率總和和獎(jiǎng)品名稱
    prob_sum = 0
    prize_name = None
 
    # 判斷在白名單內(nèi),中一等獎(jiǎng)
    if name not in active_user:
        return "很抱歉,您沒有資格參與活動(dòng)"
 
    else:
        # 遍歷獎(jiǎng)品列表
        for name, prob in prizes.items():
            # 累加概率總和
            prob_sum += prob
            # 如果隨機(jī)數(shù)小于等于概率總和,則中獎(jiǎng)
            if lucky_number <= prob_sum:
                prize_name = name
                break
    return prize_name
 
#測(cè)試一下
print(lottery("Tom"))#如果沒有參與加法活動(dòng),來參與,無法抽獎(jiǎng)
print(addition("Tom"))#Tom先來參與加法活動(dòng)再去參與活動(dòng)
print(lottery("Tom"))#參與活動(dòng)抽獎(jiǎng)

第三種:打死都不讓你中

這種活動(dòng)純純就是惡心人而做的,但是所有參加的用戶完全就是不知道,都會(huì)以為是自己的運(yùn)氣差。大獎(jiǎng)就在哪里,就是拿不到。

這都不用概率,直接給你出結(jié)果,完全就是他的營(yíng)銷手段。

代碼如……不如了,都不需要,直接一個(gè)return搞定。

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

這種就需要和我們?cè)O(shè)置的隨機(jī)范圍撤上關(guān)系,我們的隨機(jī)范圍是1-100,比例為百分比1-100的整數(shù),但是當(dāng)我們加上小數(shù)之后,就不一樣。比如:

1%和1.00%

那現(xiàn)在這兩種概率你覺得是一樣的嗎?

答案肯定是不一樣的,第一個(gè)是百分之一,第二個(gè)則是萬分之一。因?yàn)榈谝粋€(gè)沒有算小數(shù),第二個(gè)還有兩位小數(shù),看似相等,其實(shí)已經(jīng)變了。

如下圖:這三個(gè)箭頭指向,所占比例大概就是80%,20%,當(dāng)我們數(shù)據(jù)越多,范圍就會(huì)越廣,如果隨機(jī),那數(shù)據(jù)會(huì)更容易落到80%。

抽獎(jiǎng)概率正確性,我們其實(shí)可以從概率的統(tǒng)計(jì)定義中來看待。

在一定條件下,重復(fù)做n次試驗(yàn),nA為n次試驗(yàn)中事件A發(fā)生的次數(shù),如果隨著n逐漸增大,頻率nA/n逐漸穩(wěn)定在某一數(shù)值p附近,則數(shù)值p稱為事件A在該條件下發(fā)生的概率。

就是說數(shù)值越多,越是能證明概率的正確性。但是,我們抽獎(jiǎng)只有一次機(jī)會(huì)。對(duì)于我來說80%肯定比20%更加容易隨機(jī)。

代碼控制:控制隨機(jī)值,1-10000。

第五種:某榮耀-有機(jī)率

有機(jī)率估計(jì)是某王常用套路了,有機(jī)率基本等于沒有。文字游戲算是被玩明白了。當(dāng)然因?yàn)橛脩趔w量比較大,因此,也可能采用第4種方式,萬分之一,或者是百萬分之一。

第六種:保底機(jī)制

這種機(jī)制就是比較明確的,整體意思就是,我已經(jīng)做好坑你準(zhǔn)備了,但是坑了我就收手,讓你看到希望,給你大獎(jiǎng)。常見的有抽了多少次,我就給你中什么獎(jiǎng)品。

這里我們?cè)O(shè)置保底機(jī)制為10次必中一等獎(jiǎng)。如果前9次都沒有中獎(jiǎng),第10次一定中一等獎(jiǎng)。

代碼如下:

import random
 
# 獎(jiǎng)品列表和對(duì)應(yīng)的概率
prizes = {"一等獎(jiǎng)": 1, "二等獎(jiǎng)": 2, "三等獎(jiǎng)": 3, "參與獎(jiǎng)": 94}
 
lottery_num = 0  # 記錄已經(jīng)抽中的一等獎(jiǎng)、二等獎(jiǎng)、三等獎(jiǎng)的次數(shù)
# 抽獎(jiǎng)函數(shù)
def lottery():
    # 生成一個(gè)1~100之間的隨機(jī)數(shù)
    global lottery_num
    lucky_number = random.randint(1, 100)
    print(lucky_number,lottery_num)
    # 初始化概率總和和獎(jiǎng)品名稱
    prob_sum = 0
    prize_name = None
 
    # 遍歷獎(jiǎng)品列表
    for name, prob in prizes.items():
        # 累加概率總和
        prob_sum += prob
        # 如果隨機(jī)數(shù)小于等于概率總和,則中獎(jiǎng)
        if lucky_number <= prob_sum:
            prize_name = name
            break
    if prize_name=="參與獎(jiǎng)":
        lottery_num += 1
        if lottery_num == 10:
            return "恭喜你,中一等獎(jiǎng)"
        return prize_name
    else:
        lottery_num=0
        return prize_name
 
for i in range(10):
    print(lottery())

三、文章總結(jié)

文章主要總結(jié)一些基本的抽獎(jiǎng)邏輯,主要使用隨機(jī)數(shù)模塊,random??梢詭椭覀兞私夂褪褂秒S機(jī)數(shù)模塊,更好的使用。

另外,凡是抽獎(jiǎng),必定包含有不確定性和被控制性。因?yàn)殡S機(jī)意味著脫離了自己的掌控,并不劃算。如果不是信任的機(jī)構(gòu),那就把他當(dāng)做概率為0。

其實(shí)抽獎(jiǎng)的應(yīng)用,還可以延伸出其他的一些東西,這期過長(zhǎng),下期繼續(xù)。

到此這篇關(guān)于Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路的文章就介紹到這了,更多相關(guān)Python抽獎(jiǎng)系統(tǒng)設(shè)計(jì)思路內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)彈跳小球

    python實(shí)現(xiàn)彈跳小球

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • pygame游戲之旅 游戲中添加顯示文字

    pygame游戲之旅 游戲中添加顯示文字

    這篇文章主要為大家詳細(xì)介紹了pygame游戲之旅的第5篇,教大家如何在游戲中添加顯示文字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例

    Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例

    這篇文章主要介紹了Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口

    Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口

    這篇文章主要介紹了Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Python全棧之for循環(huán)

    Python全棧之for循環(huán)

    這篇文章主要為大家介紹了Python for循環(huán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python endswith()函數(shù)的具體使用

    Python endswith()函數(shù)的具體使用

    本文主要介紹了Python endswith()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python中的txt文件轉(zhuǎn)換為XML

    python中的txt文件轉(zhuǎn)換為XML

    這篇文章主要介紹了python中的txt文件轉(zhuǎn)換為XML問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python批量修改文件名的三種方法實(shí)例

    python批量修改文件名的三種方法實(shí)例

    同事最近有個(gè)需求,需要批量修改文件的名稱,這篇文章主要給大家介紹了關(guān)于python批量修改文件名的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV)

    Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV)

    這篇文章主要介紹了Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python之停止打印日志/重復(fù)打印日志方式

    python之停止打印日志/重復(fù)打印日志方式

    這篇文章主要介紹了python停止打印日志/重復(fù)打印日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論