鍍金池/ 問答/PHP/ 一個(gè)抽獎(jiǎng)的算法

一個(gè)抽獎(jiǎng)的算法

求一個(gè)抽獎(jiǎng)的算法 , 在下面數(shù)組的 8個(gè)對(duì)象中 抽獎(jiǎng), 根據(jù) 后面的 中獎(jiǎng)概率,返回 a,b,c
中獎(jiǎng)概率這個(gè) 可以不遵循 全加起來(lái)為 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.中獎(jiǎng)概率的理解:概率越大,被抽中的幾率就越大,假設(shè)字母a-h(可以有重復(fù))總個(gè)數(shù)為S,字母a的的個(gè)數(shù)為A,那么字母a被抽中的概率為:p = A/S
2.如題目所給出的字母對(duì)象及概率。假設(shè)字母a-h總個(gè)數(shù)為2000,那么根據(jù)概率,a應(yīng)為400個(gè),b為400個(gè),c為400個(gè),d為200個(gè),e為200個(gè),f為200個(gè),g為200個(gè),h為1個(gè)。
3.將所有字母想象成球,放在一個(gè)口袋里,隨機(jī)抽取。程序語(yǔ)言說(shuō)明為,將字母全部存儲(chǔ)在一個(gè)數(shù)組里,每次隨機(jī)一個(gè)數(shù)作為下標(biāo),根據(jù)下標(biāo)所得的字母就是抽取的結(jié)果。
簡(jiǎn)單編程(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%],
]
# 為了保證字母?jìng)€(gè)數(shù)為非負(fù)整型,假設(shè)h為1個(gè),總個(gè)數(shù)為2000個(gè)
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)生一個(gè)隨機(jī)索引
index = random.randint(0,len(arr))
#根據(jù)隨機(jī)索引尋找字母
result = arr[index]

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

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

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

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

2017年10月19日 17:55