根据分布生成随机数

问题描述 投票:0回答:7

我想根据一些分布生成随机数。我该怎么做?

random distribution
7个回答
21
投票

您拥有的标准随机数生成器(C 语言中的

rand()
,经过简单转换后,在许多语言中等效)是对 [0,1] 范围内均匀分布的相当好的近似。如果这就是您所需要的,那么您就完成了。将其转换为在更大的整数范围内生成的随机数也很简单。

SO 已经涵盖了均匀分布到正态分布的转换,以及指数分布

[编辑]:对于

三角分布,转换统一变量相对简单(类似于C):

double triangular(double a,double b,double c) { double U = rand() / (double) RAND_MAX; double F = (c - a) / (b - a); if (U <= F) return a + sqrt(U * (b - a) * (c - a)); else return b - sqrt((1 - U) * (b - a) * (b - c)); }

这只是转换维基百科页面上给出的公式。如果你想要其他的,那就从那里开始寻找;一般来说,您使用uniform变量在您想要的分布的

累积密度函数的垂直轴上选取一个点(假设它是连续的),然后反转CDF以获得具有所需分布的随机值。


11
投票
正确的方法是将分布分解为 n-1 个二元分布。也就是说,如果您有这样的发行版:

A: 0.05 B: 0.10 C: 0.10 D: 0.20 E: 0.55

将其转换为 4 个二进制分布:

1. A/E: 0.20/0.80 2. B/E: 0.40/0.60 3. C/E: 0.40/0.60 4. D/E: 0.80/0.20

从n-1个分布中均匀选择,然后根据每个符号在二元分布中的概率选择第一个或第二个符号。

代码在这里


5
投票
这实际上取决于分布。最一般的方法如下。令 P(X) 为根据您的分布生成的随机数小于 X 的概率。

首先生成 0 到 1 之间的均匀随机 X。之后,您找到 Y,使得 P(Y) = X 并输出 Y。您可以使用二分搜索找到这样的 Y(因为 P(X) 是 X 的递增函数)。

这不是很有效,但适用于可以有效计算 P(X) 的分布。


5
投票
您可以查找逆变换采样、拒绝采样以及 Devroye 的书“

非均匀随机变量生成”/Springer Verlag 1986


1
投票
您可以通过插值将离散 bin 转换为 float/double。简单的线性效果很好。如果表内存有限,可以使用其他插值方法。 -jlp


0
投票
在过去的几年里,SciPy 中添加了一些不错的新工具来解决 Python 中的此类问题。只需提供一些有关分布的信息(例如密度/pdf),您就可以轻松地从自定义连续或离散单变量分布生成样本。

不同方法的概述:

https://docs.scipy.org/doc/scipy/reference/stats.sampling.html

教程:

https://docs.scipy.org/doc/scipy/tutorial/stats/sampling.html

如果您使用 R,Runuran 中提供了非常相似的功能 (

https://CRAN.R-project.org/package=Runuran)。

C 库 UNURAN:

https://statmath.wu.ac.at/unuran/doc.html


© www.soinside.com 2019 - 2024. All rights reserved.