最近接手了一个大转盘的抽奖活动,刚开始也没有具体的思路,在经过冥思苦想并查找后总结出以下几种实现概率的方案:
第一种
import random
def select():
num = ["一等奖", "二等奖", "三等奖"]
# 概率列表
r = [0.1, 0.3, 0.6]
sum = 0
ran_num = random.random()
for num, r in zip(num, r):
sum += r
if ran_num < sum:
break
return num
num_a = 0
num_b = 0
num_c = 0
for i in range(100000):
result = select()
if result == "一等奖":
num_a += 1
elif result == "二等奖":
num_b += 1
else:
num_c += 1
print("num_a:", num_a)
print("num_b:", num_b)
print("num_c:", num_c)
下面是结果:
第二种:次数随机算法
class randomMachine(object):
import random as rd
def setWeight(self, weight):
self.weight = weight
self.chanceList = []
for k, v in self.weight.items():
for t in range(v):
self.chanceList.append(k)
return self.chanceList
def drawing(self):
r = self.rd.randrange(0, len(self.chanceList)) # 随机数
print(self.chanceList.pop(r))
def graphicsUI(self):
pass
def start(self):
pass
if __name__ == "__main__":
test = randomMachine()
test.setWeight({"一等奖": 1, "二等奖": 1, "三等奖": 1, "安慰奖": 6})
for i in range(9):
test.drawing()
以下是结果
第三种 : 概率随机算法
class randomMachine(object):
import random as rd
def setWeight(self, weight):
self.weight = weight
WEIGHT = {}
weightLength = len(self.weight) # 权重个数
valueCount = 0 # 权重合计
for v in self.weight.values():
valueCount += v
for k, v in self.weight.items():
WEIGHT[k] = 1000000 * v / valueCount # 一百万乘以权重所占百分比
# 区间 [1,400000,400000+600000]
self.compare = {"FIRST_PART": 0}
tmp = 0
for k, v in WEIGHT.items():
tmp += v
self.compare[k] = tmp
def drawing(self):
r = self.rd.randrange(1, 1000001) # 随机数
# print("随机数 : ", r)
tmp = 0
name = ''
for k, v in self.compare.items():
# print('k : ', k, "v :", v) #先判断随机数是否小于等于范围
if r <= v:
if tmp == 0: # 第一次判断
tmp = v
name = k
if v < tmp:
tmp = v
name = k
print(name)
self.weight[k] -= 1 # 每次执行少一次奖励
def graphicsUI(self):
pass
def start(self):
pass
if __name__ == "__main__":
test = randomMachine()
test.setWeight({"一等奖": 1, "二等奖": 1, "三等奖": 1, "安慰奖": 6})
for i in range(9):
test.drawing()
因为概率算法结果差距很大,可以自己测试,不在此粘代码
第四种:先定义好概率(本人觉得是第一种的简化版)
import random
di = {
"yi": (0, 0.08),
"er": (0.08, 0.3),
"san": (0.3, 1)
}
def dih():
i = random.random()
for k, v in di.items():
if v[0] <= i <= v[1]:
return k
zi = {}
for j in range(1000):
m = dih()
if m not in zi:
zi[m] = 1
else:
zi[m] += 1
for k, v in zi.items():
print(k, v)
以下是结果
第五种:我亲自实现的
先说一下大概的需求:一共9中奖品,每天可以抽奖一次,只有前5次可能会中奖,从第6次开始都是谢谢参与奖,第一次必须中其中的一种(这里是已经指定好的**奖品),但前五次抽中的奖品除了有一种可以种两次外其他不可以重复
代码就不贴了,很多,因为上面的需求也只是一小部分,如果有感兴趣的小伙伴可以私聊我