Random.choices 不返回均匀分布

问题描述

我正在尝试使用 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,popsize=10000)

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

解决方法

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

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

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

以下是所有的 [2 2] 排列:

[1,1]

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

,

作为代码整洁的一部分,您正在设置 // Logging compile "org.slf4j:slf4j-jdk14" implementation "org.apache.logging.log4j:log4j-api:$log4jVersion" implementation "org.apache.logging.log4j:log4j-core:$log4jVersion" implementation group: 'org.springframework.boot',name: 'spring-boot-starter-log4j2',version: "$log4jVersion" // Spring Dependencies compile group: "org.springframework.kafka",name: "spring-kafka",version: "$springBootVersion" compile group: "org.springframework",name: "spring-jdbc",version: "$springJdbcVersion" compile(group: "org.springframework.boot",name: "spring-boot-starter-web",version: "$springWebVersion") { exclude group: "ch.qos.logback",module: "logback-classic" exclude group: "org.springframework.boot",module: "spring-boot-starter-logging" } ,这隐藏了使用该策略有两种方法可以获取 key = str(numpy.sort(counts)) 的键。

如果你在没有排序的情况下再次运行测试,我想你会发现结果 [1 3] 比你预期的更常见,但是 [2 2][1 3] 的结果分别是少结合到更多。

例如:

[3 1]

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