python - 非均匀分布随机数组

标签 python random

我需要生成一个介于 [0,1] 之间的随机 float 向量 它们的总和等于 1 并且分布不均匀。 有没有生成这样一个向量的 python 函数?

祝福

最佳答案

您可能正在寻找的发行版称为 Dirichlet distribution . Python 中没有用于从 Dirichlet 分布中抽取随机数的内置函数,但是 NumPy包含一个:

>>> from numpy.random.mtrand import dirichlet
>>> print dirichlet([1] * n)

这将为您提供总和为 1 的 n 个数字,并且每个此类组合的概率都相等。

或者,如果您没有 NumPy,您可以利用这样一个事实,即可以通过绘制 nn 维 Dirichlet 分布中抽取的随机样本em> 来自 gamma distribution 的独立样本形状和尺度参数等于 1,然后将样本除以总和:

>>> from random import gammavariate
>>> def dirichlet(n):
...     samples = [gammavariate(1, 1) for _ in xrange(n)]
...     sum_samples = sum(samples)
...     return [x/sum_samples for x in samples]

之所以需要 Dirichlet 分布,是因为如果简单地从某个区间均匀地抽取随机数,然后将它们除以它们的总和,得到的分布将偏向于由大致相等的数字组成的样本。参见 Luc Devroye's book有关此主题的更多信息。

关于python - 非均匀分布随机数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028571/

相关文章:

python - Matlab 中的高效矩阵乘法

python - 如何部署tensorflow系统? tensorflow 服务?

python - 有时我的套装是有序的,有时不是(Python)

objective-c - Objective C 中的多个随机数生成器

在 0 和 1 之间快速随机 float

c++ - C++11 和 RDRAND 的真随机数

python - Pandas 分组操作

python - 动态更改代表类对象的实例变量 - Python

Python 将两个列表写入 csv、展平并带有列标题

java - 需要返回字符串,但只能使用随机数生成器获取 int