在python中生成随机值列表,其中每个值的出现率都有一定的百分比

2024-09-27 21:23:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望生成一个大小为N的列表,比如说,我有m个唯一元素{v1,v2,…,vm,我可以确定确实存在v1发生的v1,Np2出现v2。。。,Npmvm,其中p1+p2+。。。+p3=1。在

作为一个具体的例子,我想生成一个随机的10个元素的列表,其中1出现的几率为20%,2的出现率为30%,3的出现率为50%。以下列表是可以接受的随机生成的列表:

L1 = [1,3,2,1,3,3,3,2,3,2]
L2 = [3,3,3,1,2,1,3,3,2,2]

如果我的输入是一个元组列表,其中包含(值,概率)对和N,即要生成的列表的长度,那么我正在寻找最通用的python方法来实现这一点。 e、 g.对于上述情况:

^{pr2}$

Tags: 元素l1列表vm例子v2元组v1
2条回答

构建列表,然后使用random.shuffle()使其随机。例如:

import random

def build_list(params, num):
    result = []
    for value, prob in params:
        count = int(prob * num)
        for _ in range(count):
            result.append(value)
    random.shuffle(result)
    return result

或者,作为列表理解:

^{pr2}$

结果:

>>> build_list([(1,0.2),(2,0.3),(3,0.5)], 10)
[3, 2, 3, 2, 3, 1, 3, 3, 2, 1]

注意:因为您指定的是概率,这最多将产生结果prob * num个结果。。。因为如果不是整数,它会去掉分数:

>>> build_list([(1,0.2),(2,0.25),(3,0.55)], 10)
[3, 3, 2, 2, 3, 1, 1, 3, 3]

丢失项有50%的几率是2或{}。所以有一个警告。在

要解释这一损失,您必须选择:

  1. 最大的可能性得到额外的价值(并找出一个打破僵局的方法)
  2. 通过计算重量随机选择

添加随机加权缺失项的示例:

def build_list(params, num):
    result = [value for value, prob in params for _ in range(int(prob * num))]
    while len(result) < num:  # some value lost 
        roll = random.random()  # pick which value
        prob_sum = 0
        for value, prob in params:
            prob_sum += (prob * num) % 1
            if prob_sum > roll:
                result.append(value)
                break
    random.shuffle(result)
    return result

计算每个元素所需的数量。 创建一个包含您需要的所有元素的列表。 洗牌。例如:

>>> deck = [1]*2 + [2]*3 + [3]*5
>>> deck
[1, 1, 2, 2, 2, 3, 3, 3, 3, 3]
>>> random.shuffle(deck)
>>> deck
[1, 1, 3, 3, 3, 3, 2, 2, 3, 2]

结合创作序列。。。在

^{pr2}$

输出:

[1, 1, 2, 2, 2, 3, 3, 3, 3, 3]
[1, 3, 3, 3, 2, 3, 1, 3, 2, 2]

补丁

为了保证列表的长度合适,我们可以采取一种低思想的方法:生成除最后一项之外的所有内容,然后用最后一项填充列表的其余部分。TemporalWolf提出的解决方案总体上是比较好的,但这个方案适用于大多数应用。在

for item in T[:-1]:
    deck += [item[0]] * int(round(N*item[1]))
# Use final item to guarantee that the list is the correct length
deck += [T[-1][0]] * (N - len(deck))

如果N太低,而且很多频率都是0,我们仍然会遇到麻烦。如果最后一个项目的频率较低,而其他项目的汇总次数很多,则此操作也可能失败:如果列表已经太长,则此操作将失败。在

相关问题 更多 >

    热门问题