【问题标题】:Place 2 values randomly in array with certain probability以一定的概率将 2 个值随机放入数组中
【发布时间】:2020-06-19 08:30:11
【问题描述】:

我想通过分配列表seq=[30,170] 的值,在python 中创建一个长度为24 的随机数组。所以我想要一个看起来像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) 

【问题讨论】:

    标签: python random probability


    【解决方案1】:

    您可以向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]])) 
    

    【讨论】:

    • 这正是我想要的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2017-03-24
    • 2016-01-06
    • 2011-12-25
    • 2011-04-10
    • 2021-04-27
    • 2019-06-30
    • 1970-01-01
    相关资源
    最近更新 更多