以一定的概率将 2 个值随机放入数组中



我想在python中创建一个长度为24的随机数组,方法是分配列表的值seq=[30,170]。所以我想有一个看起来像a=[30,30,30,170,30,170,...]的数组。问题是,这些值不应该完全随机分配,而应该有一定的概率。在这种情况下,如果第一个值为 30(或 170(,则下一个值为 30(或 170(的概率也应为 90%,下一个值为 170(或 30(的概率应为 10%。

有谁知道如何做到这一点?目前,我只找到了如何随机排列它们。谢谢!!

import random
seq=[30,170] 
a = random.choices(seq,k=24) 

您可以为 random.choices(population, weights=None, *, cum_weights=None, k=1( 提供权重。

您需要迭代执行此操作,以便在查找需要使用的权重时能够引用最后一个值:

import random
seq = [30, 170] 
# weight lookup
wgt = {30: (90, 10), 170:(10, 90)}
r = []
for _ in range(24):
if not r:
# need some initial value: 50/50
r.append(random.choice(seq))
else:          
# k == 1, using correct weights from lookup, use only single value and add it
r.append(random.choices(seq, weights=wgt[r[-1]], k=1)[0])
print(r)

8 次运行输出:

[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170]
[30, 30, 30, 30, 30, 30, 170, 170, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
[30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
[30, 30, 30, 30, 30, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 170, 170, 170, 170, 170, 170, 170, 170, 170]
[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 30, 170, 170, 170, 170]
[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30]
[30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
[30, 30, 170, 170, 30, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

您也可以自己提供权重:

seq = [30,170]
w = {30: (30,30,30,30,30,30,30,30,30,170),           # if  30: use 9 * 30 + 1 * 170
170:(30,170,170,170,170,170,170,170,170,170)}   # if 170: use 9 * 170 + 1 * 30
r = []
for _ in range(24):
if not r:
r.append(random.choice(seq))
else:          
r.append(random.choice(w[r[-1]])) 

最新更新