【问题标题】:Generating non-uniform random numbers [closed]生成非均匀随机数 [关闭]
【发布时间】:2009-06-10 18:24:12
【问题描述】:

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

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

【问题讨论】:

  • 这取决于你想要的分布。

标签: artificial-intelligence random


【解决方案1】:

尝试生成均匀分布的随机数,然后将倒置非均匀 cumulative distribution function 应用于每个随机数。

【讨论】:

  • 错了,你必须反转你的分布函数。如果你想要平方分布,你必须取随机数的平方根。
  • 我假设分布函数应用了适当的反转。我认为您的问题更多在于所用函数的分布类型的术语。
  • 是的,但术语很重要。而且你违反了标准。
  • @subtenante:已编辑以反映您建议的更改。
  • 我刚刚澄清了答案,强调它是您要应用的逆 CDF(不是 PDF 或其他任何内容)。
【解决方案2】:

你想要什么样的偏差分布?

这是一种总是有效的技术,但并不总是最有效的。累积分布函数 P(x) 给出了值低于 x 的时间分数。因此,在 x 的最低可能值处 P(x)=0,在 x 的最高可能值处 P(x)=1。每个分布都有一个唯一的 CDF,它以 P(x) 从 0 上升到 1 的方式对分布的所有属性进行编码。如果 y 是区间 [0,1] 上的均匀偏差,则 x 满足 P(x )=y 将根据您的分配进行分配。为了使这项工作在计算上进行,您只需要一种方法来计算您的分布的 P(x) 的倒数。

Meta.Numerics 库定义了大量常用分布(例如正态、对数正态、指数、卡方等),并具有计算 CDF (Distribution.LeftProbability) 和逆 CDF (Distribution.InverseLeftProbability) 的函数)。

适用于对特定分布快速的专业技术,例如正态分布偏差的 Box-Muller 技术,请参阅 Numerical Recipies 一书。

【讨论】:

  • 没关系,我只是在寻找跨不同分布生成数字的方法。我想我没想到那么远。听起来我需要多读一些,这是你说的书吗?数值食谱第 3 版:科学计算的艺术
  • 是的,就是这本书。这是数值计算的标准介绍,但需要大量的金钱和精力。如果您只是想要该死的偏差,我会坚持使用图书馆。使用我提到的那个,它很简单: Random rng = new Random(1);分布 dist = new NormalDistribution(1.0,2.0);双 x = dist.InverseLeftProbability(rng.NextDouble());
  • 太棒了,这肯定是我想做得更好的事情。我确实打算看看这本书。非常感谢。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 2020-09-07
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多