我有一个概率算法的问题
目标是获得一个包含三个项目的列表。作为最终名单
有四个源列表。
ALIST、BLIST、CLIST、DLIST
都有未知长度。它们包含独特的元素
(其实程序一开始都是空的,从redis排序列表中获取。运行时,有增长)
从此源列表中选择项目。拾取随机项目以生成 FinalList
确保以下要求
在决赛名单中,
- ALIST 的项目出现的概率是 43%
- BLIST的物品出现的概率是37%
- CLIST的物品出现的概率是19%
- DLIST 的项目出现的概率是 1%
我写了一些代码,但这只是为了四个列表有很多元素。
from random import choice
final_list = []
slot = []
a_picked_times = 0
while a_picked_times < 43:
item = choice(ALIST)
ALIST.remove(item)
if item in already_picked_list:
continue
slot.append(item)
a_picked_times += 1
b_picked_times = 0
while b_picked_times < 37:
...
SOME CODE SIMILAR
# now slot is a list which contains 100 elements,
# in slot, there are 43 elements of ALIST'items, 37 of B, 19 of C, 1 of D
for i in range(3):
final_list.append( choice(slot) )
所以,这样可以保证概率要求。 但仅在条件下:这四个列表有很多元素。
list.remove(item) 不会删除列表中的所有元素,因此我们将根据需要的时间更正拾取项目。
当 A、B、C、D 为空或元素不足时,如何保证概率要求?
A、B、C、D 列表都是从 redis 排序列表中获取的。或者redis的一些解决方案?