一个抽奖的算法

求一个抽奖的算法 , 在下面数组的 8个对象中 抽奖, 根据 后面的 中奖概率,返回 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%},
]
阅读 2.4k
3 个回答

程序思路:
1.中奖概率的理解:概率越大,被抽中的几率就越大,假设字母a-h(可以有重复)总个数为S,字母a的的个数为A,那么字母a被抽中的概率为:p = A/S
2.如题目所给出的字母对象及概率。假设字母a-h总个数为2000,那么根据概率,a应为400个,b为400个,c为400个,d为200个,e为200个,f为200个,g为200个,h为1个。
3.将所有字母想象成球,放在一个口袋里,随机抽取。程序语言说明为,将字母全部存储在一个数组里,每次随机一个数作为下标,根据下标所得的字母就是抽取的结果。
简单编程(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%],
]
# 为了保证字母个数为非负整型,假设h为1个,总个数为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)
#产生一个随机索引
index = random.randint(0,len(arr))
#根据随机索引寻找字母
result = arr[index]

可以假定总的概率为1-100 a为1-20 b为21-40等等 h取一个数,比如78 这样是最简单的
可以加工一下,比如随机到78,就在随机一次,如果在中,就在随机一次,设置一个最大重随机次数,比如5次,如果5次都随机为78就算中大奖,这个最大重随机次数根据你的实际情况进行设置

a-h总中奖概率为100,那么可以将a-h看成一条直线,根据中奖概率,a = 1-20,b=21-40,c=41-60, d=61-70,e=71-80,。这样随机一个1-100的数字,看数字位于哪个区间即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题