生成非均匀随机数

8

你能告诉我生成非均匀随机数的任何方法吗?
我正在使用Java,但是代码示例可以使用您想要的任何语言。

一种方法是通过将两个均匀随机数相加(即掷2个骰子)来创建偏斜分布。


这取决于您想要的分发方式。 - i_am_jorf
3个回答

11

尝试生成均匀分布的随机数,然后将倒数非均匀累积分布函数应用于每个随机数。


错误,您必须反转您的分布函数。如果您想要平方分布,您必须取随机数的平方根。 - glmxndr
我做出的假设是分布函数应用了适当的反演。我认为你的问题更多地涉及到所使用的函数类型的术语。 - Paul Sonier
是的,但术语很重要。而且你违反了标准。 - glmxndr
@subtenante:已根据您的建议进行编辑。 - Paul Sonier
我只是澄清答案,强调你想要应用的是反向CDF(而不是PDF或其他任何东西)。 - Noldorin

7

你需要哪种偏差分布?

这里有一种技术总是有效的,但并不总是最有效的。累积分布函数P(x)给出了数值低于x的时间比例。因此,当x的可能最低值为0时,P(x)= 0,并且当x的可能最高值为1时,P(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技术),请参见《Numerical Recipies》。


没关系,我只是在寻找不同分布下生成数字的方法。我想我还没有深入思考过这个问题。听起来像是我需要多读一些书,你说的是这本书吗?《Numerical Recipes 3rd Edition: The Art of Scientific Computing》。 - Robert Greiner
是的,那就是那本书。它是数值计算的标准介绍,但需要投入大量金钱和精力。如果你只想要该死的偏差,我建议使用一个库。使用我提到的那个库,只需简单地执行以下操作:Random rng = new Random(1); Distribution dist = new NormalDistribution(1.0,2.0); double x = dist.InverseLeftProbability(rng.NextDouble()); - DCW
太棒了,这是我一定要更加精通的东西。我确实打算查看这本书。非常感谢你。 - Robert Greiner

1
如果您正在使用Java,那么我的Uncommons Maths库可能会引起您的兴趣。它包括用于生成均匀分布、高斯分布、泊松分布、二项式分布和指数分布的随机数的类。这篇文章展示了您如何使用这些分布。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接