鍍金池/ 問答/PHP/ 一個抽獎的算法

一個抽獎的算法

求一個抽獎的算法 , 在下面數(shù)組的 8個對象中 抽獎, 根據(jù) 后面的 中獎概率,返回 a,b,c
中獎概率這個 可以不遵循 全加起來為 100%

[
    {"a", 20.00%},
    {"b", 20.00%},
    {"c", 20.00%},
    {"d", 10.00%},
    {"e", 10.00%},
    {"f", 10.00%},
    {"g", 10.00%},
    {"h", 0.05%},
]
回答
編輯回答
笨小蛋

程序思路:
1.中獎概率的理解:概率越大,被抽中的幾率就越大,假設(shè)字母a-h(可以有重復(fù))總個數(shù)為S,字母a的的個數(shù)為A,那么字母a被抽中的概率為:p = A/S
2.如題目所給出的字母對象及概率。假設(shè)字母a-h總個數(shù)為2000,那么根據(jù)概率,a應(yīng)為400個,b為400個,c為400個,d為200個,e為200個,f為200個,g為200個,h為1個。
3.將所有字母想象成球,放在一個口袋里,隨機抽取。程序語言說明為,將字母全部存儲在一個數(shù)組里,每次隨機一個數(shù)作為下標(biāo),根據(jù)下標(biāo)所得的字母就是抽取的結(jié)果。
簡單編程(python)

# usr/bin/python
# -*- coding=utf-8 -*-
# 初始化
data = [
    ["a", 20.00%],
    ["b", 20.00%],
    ["c", 20.00%],
    ["d", 10.00%],
    ["e", 10.00%],
    ["f", 10.00%],
    ["g", 10.00%],
    ["h", 0.05%],
]
# 為了保證字母個數(shù)為非負(fù)整型,假設(shè)h為1個,總個數(shù)為2000個
all = 2000
arr = []
for i in range(len(data)):
    letter = data[i][0]
    num = data[i][1]*all
    for j in range*(num):
        arr.append(letter)
#產(chǎn)生一個隨機索引
index = random.randint(0,len(arr))
#根據(jù)隨機索引尋找字母
result = arr[index]

2017年4月9日 20:15
編輯回答
北城荒

a-h總中獎概率為100,那么可以將a-h看成一條直線,根據(jù)中獎概率,a = 1-20,b=21-40,c=41-60, d=61-70,e=71-80,。這樣隨機一個1-100的數(shù)字,看數(shù)字位于哪個區(qū)間即可。

2017年2月13日 01:41
編輯回答
失心人

可以假定總的概率為1-100 a為1-20 b為21-40等等 h取一個數(shù),比如78 這樣是最簡單的
可以加工一下,比如隨機到78,就在隨機一次,如果在中,就在隨機一次,設(shè)置一個最大重隨機次數(shù),比如5次,如果5次都隨機為78就算中大獎,這個最大重隨機次數(shù)根據(jù)你的實際情況進(jìn)行設(shè)置

2017年10月19日 17:55