【问题标题】:Random.choices not returning uniform distributionRandom.choices 不返回均匀分布
【发布时间】:2021-08-24 19:03:44
【问题描述】:

我正在尝试使用 random.choices 模拟离散值的均匀分布。每次生成新集合时,表示唯一计数的键都会递增。

为什么([2,2])[1,3] 更不可能发生统一结果?

def sim_counts(size, values=[1,-1], popsize=2):
    
    count_dict = {}
    for i in range(popsize):
        X = random.choices(values,k=size)
        _, counts = np.unique(X, return_counts=True)
        
        if len(counts) == 1:
            counts = [0,counts[0]]
        key = str(np.sort(counts))

        if key not in count_dict:
            count_dict[key] = 0
            count_dict[key] +=1
        else:
            count_dict[key] +=1
            
    return count_dict
   
sim_counts(4, values=[1,-1], popsize=10000)

>>> {'[2 2]': 3747, '[0 4]': 1319, '[1 3]': 4934}

【问题讨论】:

  • 设置 key = str(counts) 而不是 key = str(numpy.sort(counts)) 你会明白为什么:-)
  • 天哪!谢谢
  • 此外,如果您执行“从集合导入 defaultdict”然后设置 count_dict = defaultdict(int),此代码会更简洁。然后你可以在没有 if/else 语句的情况下执行 count_dict[key] += 1。
  • @JonSG,如果你把它写成答案,我会接受。
  • @user2263572 或使用Counter

标签: python random statistics


【解决方案1】:

这实际上是一个数学问题而不是编程。

以下是产生[3 1] 计数的所有排列:

[1, 1, 1, -1]
[1, 1, -1, 1]
[1, -1, 1, 1]
[-1, 1, 1, 1]
[-1, -1, -1, 1]
[-1, -1, 1, -1]
[-1, 1, -1, -1]
[1, -1, -1, -1]

这里是所有[2 2] 排列:

[1, 1, -1, -1]
[1, -1, 1, -1]
[-1, 1, 1, -1]
[1, -1, -1, 1]
[-1, 1, -1, 1]
[-1, -1, 1, 1]

所以比例是 8:6,这是您的结果的大致比例。

【讨论】:

    【解决方案2】:

    作为整理代码的一部分,您正在设置 key = str(numpy.sort(counts)),这隐藏了使用该策略获取 [1 3] 密钥的两种方法。

    如果您在没有排序的情况下再次运行测试,我想您会发现结果[2 2] 比您预期的更常见,但[1 3][3 1] 的结果虽然单独较少,但组合较多.

    例如:

    {'[3 1]': 2521, '[1 3]': 2550, '[2 2]': 3721, '[0, 4]': 1208}
    

    另请参阅@barmar 的回答,以更细致入微地了解导致相关键的各个排列。

    【讨论】:

    • 谢谢。我犯了一个菜鸟错误。
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2014-09-27
    • 2020-04-04
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多