你能告诉我生成非均匀随机数的任何方法吗?
我正在使用 Java,但是代码示例可以用任何你想要的语言。
一种方法是通过将两个均匀随机数相加来创建倾斜的分布(即,掷 2 个骰子)。
回答:
你想要什么分布的离差?
这里有一种始终有效,但并非总是最有效的技术。 累积分布函数 P(x) 给出了值低于 x 的时间的比例。 因此,P(x) 在 x 的最低可能值处为 0,在 x 的最高可能值处为 1。 每个分布都有一个唯一的 CDF,它以 P(x) 从 0 上升到 1 的方式编码了分布的所有属性。 如果 y 是区间 [0,1] 上的均匀离差,那么满足 P(x)=y 的 x 将按照你的分布进行分布。 为了使这项工作在计算上可行,你只需要一种计算你的分布的 P(x) 的逆函数的方法。
Meta.Numerics 库定义了大量常用分布(例如,正态分布、对数正态分布、指数分布、卡方分布等),并且具有用于计算每个分布的 CDF (Distribution.LeftProbability) 和逆 CDF (Distribution.InverseLeftProbability) 的函数。
对于特定分布的快速专用技术,例如正态分布离差的 Box-Muller 技术,请参阅《数值食谱》一书。