【问题标题】:Generate a list of whole numbers uniformly at random with a given sum用给定的和随机均匀地生成一个整数列表
【发布时间】:2019-03-11 00:58:02
【问题描述】:

我已经看过几篇关于这个主题的帖子,但是它们似乎都不必要地复杂或错误 --- 下面的建议没有遇到前一个问题(它很简单),但可能是后者(它是错误的)。

我的目标是生成s 整数,即,正整数,均匀随机,使得它们的总和为n。对我来说,下面的解决方案是在 1 和 s 之间生成 n 随机数,然后输出频率得到我们想要的:

import random
from collections import defaultdict

samples = list()

for i in range(n) :
    samples.append(random.randint(1,s))

hist = defaultdict(int)

for sample in samples :
    hist[sample] += 1

freq = list()

for j in range(s) :
    freq.append(hist[j+1])

print('list:', freq)
print('sum:', sum(freq))

因此,例如,如果我们想要 s=10 个总和为 n=100 的随机整数,我们将从这个过程中得到,例如

list: [11, 7, 9, 12, 16, 13, 9, 10, 8, 5]
sum: 100

由于无论如何我都不是统计学家,我担心这会产生并非真正均匀分布的数字。任何 cmets/分析将不胜感激

【问题讨论】:

  • 如果代码有效但可以改进,它应该在代码审查中。该站点主要用于修复损坏的代码。
  • “均匀随机”到底是什么意思?每个单独的数字是否应该同样频繁地出现,或者每个有效组合是否应该同样出现?在第一个的情况下:请注意,例如,对于三个总和为 5 的数字,如果第一个数字是 1,则其他数字可以是 (1,3)、(2,2) 或 (3,1),但如果第一个是 3,其他两个只能是 (1,1),即一些构成数字可以在更多组合中使用,任何可能(应该?)因此出现更多。
  • 关于您的样本中的不均匀性:随机数生成效果很好,您的样本太小了。试试n=1000 或n=10000。如果数字在任何样本中出现的频率相同,那么它们就不是随机的。

标签: python random


【解决方案1】:

好吧,我相信你在这里展示的是multinomial distribution。直接来自维基百科 - “它模拟了滚动 s 面骰子 n 次的计数概率。”,与 参数向量 pi = 1/s.

然而它们似乎都不必要地复杂或错误

不确定您的想法,但在 Python 世界中,从多项式中采样意味着您使用 NumPy,然后它是单行的

import numpy as np

result = np.random.multinomial(n, [1.0/s for _ in range(s)])

对于所有可能的参数组合,它可能会更快、经过良好测试和正确。

如果您发现它更适合您,那就这样吧,但发明新方法来采样知名发行版本身就是一项艰巨的工作。请注意,有很多分布结果的总和等于固定数字 - 例如,Dirichlet-multinomial。它们有很多参数,你可以有很大的不同,从而获得不同的统计结果。

【讨论】:

    【解决方案2】:

    想象 s = 10 和 n = 1_000_000。那么所有的数字都倾向于聚集在 100_000 左右。我很确定您实际上拥有的是 lambda = n/s 的泊松分布。

    如果你想要一个更像均匀分布的东西,你可以试试这样:

    -生成0到1之间的s个随机数,让sum表示它们的总和。

    -将每个数字乘以 (n / sum),让我们将这些十进制数命名为 d_1, ..., d_s。

    -向下取整到最接近的整数并调用数字 i_1, ..., i_s。

    现在,这些总和是一些 n_i,由于四舍五入,它可能小于 n。让 rest = n - n_i。根据 d_1, ..., d_s 的其余部分除以 1 对 i_1, ..., i_s 进行排序(即根据 {d_1 % 1, ..., d_s % 1} 的排序序列对 {i_1, ..., i_s} 进行排序)最低指数的最低值。那么:

    for j in range(rest):
        i_(s-j) += 1
    

    这将为您提供 s 具有相同均匀分布的随机数,这些随机数被缩放为 Sum(i_1, ..., i_s) = n em>。

    我希望这会有所帮助。

    【讨论】:

    • 不,他没有泊松分布,请看我的回答
    • 谢谢,是的,向量服从多项分布。我从标题中假设他对每个变量的均匀分布感兴趣,并且由于多项分布中的每个条目都是独立的泊松分布,并且比例因子应用于分布向量,我认为这是一个恰当的描述。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多