【问题标题】:How to get N random integer numbers whose sum is equal to M如何获得总和等于M的N个随机整数
【发布时间】:2019-12-03 01:30:15
【问题描述】:

我想列出 N 个随机 INTEGER 数,其总和等于 M 个数。

我在 Python 中使用过 numpy 和 dirichlet 函数,但是这会生成双随机数数组,我想生成整数随机数。

import numpy as np 
np.random.dirichlet(np.ones(n))*m

解决方案可以使用其他分布,感觉就是解决问题。

【问题讨论】:

  • 整数有分布吗?
  • 我撤回了我的评论,因为我看到你乘以 m,所以你确实得到了可以截断的东西,但事实仍然是 Dirichlet根据定义,是实数的分布。二项式和泊松是两种常见的离散分布,但不具备您想要的求和属性。
  • 哦——check this out。看起来多项式是要走的路。分布与 Dirichlet 不同,但数字会相加,如果截断 Dirichlet,则无法保证。
  • 非常感谢它解决了我的问题。我已经编辑了问题,以便您可以回答我的问题。
  • 不用担心。我真的不在乎接受这个,我也最感兴趣的是找到答案。写了一个答案,只是因为我有信息弹跳。

标签: javascript python numpy dirichlet


【解决方案1】:

使用dirichlet 的问题在于它是一个实数分布。它将产生(0,1) 范围内的数字向量,其总和为 1,但截断或舍入它们可能会消除对特定总和的保证。在this post之后我们可以从multinomial分布中得到想要的效果(使用np.random.multinomial),如下:

from numpy.random import multinomial

np.random.multinomial(m, np.ones(n)/n)

这将在0m 之间生成n 整数,其和为m,绘制给定位置的概率相同。可视化这一点的最简单方法是将结果视为描述一组固定对象的绘制(例如,从 1 到 6 的整数绘制的骰子),其中最终数组是对应对象的次数画。总数将始终与给定的总抽奖次数(掷骰数)相加。

【讨论】:

    【解决方案2】:

    请注意,Dirichlet 分布可用于参数化多项式,从而控制 bin 的平滑度或“均匀性”,例如:

    import numpy as np 
    
    m = 50
    n = 5
    s = 0.1
    
    np.random.multinomial(m, np.random.dirichlet(np.ones(n) * s))
    

    大部分参数化为 @Bonfire,但较大的 s 值(例如尝试 s=100)导致 bin 以 mean=m/n 接近泊松,较小的值导致更大的方差

    【讨论】:

      【解决方案3】:

      这是一个示例解决方案:

      import numpy as np
      
      M = 50 # The fixed sum
      N = 5 # The amount of numbers
      
      array = np.random.multinomial(M, np.ones(N) / N)[0]
      print(array)
      

      【讨论】:

        猜你喜欢
        • 2011-02-08
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        相关资源
        最近更新 更多