【问题标题】:In what situations does the difference between random numbers generated on [0,1) and those generated on [0,1] make a difference?在什么情况下,在 [0,1) 上生成的随机数与在 [0,1] 上生成的随机数之间的差异会产生影响?
【发布时间】:2013-02-28 18:49:54
【问题描述】:

我习惯于在半开区间 [0,1) 中返回浮点值的伪随机数生成器。

我看到了一些对 RNG 的引用,它们可以在闭合区间 [0,1] 上返回值,例如this implementation of the Mersenne Twister.

我可以看到您出于数学原因想要排除一个或两个端点的原因,例如

exponentially_distributed=-logf( 1.0-rng() )

如果0.0<=rng()<1.0,则始终生成有效数字。

但我想不出用产生 [0,1] 的 rng 替换产生 [0,1] 的 rng 会产生任何实际差异的情况。

在什么情况下有浮点伪随机数生成器 绝对有必要返回闭区间 [0,1] 上的值?

【问题讨论】:

  • 我认为没有。但是,由于浮点类型的精度有限,何时铺地板可能很重要。
  • +1 好问题。我也想知道为什么 RNG 经常处于半开区间。定点数不能只生成随机位,那么它们如何获得浮点数的一致性呢?
  • 我认为您的问题可能与生成随机双精度的实现有关,而不是使用它。也许将问题扩大到包括生成和用例会很好。
  • @AndrewMao:通过在 [0,2^b) 范围内生成整数,然后将浮点数除以 2^b,您可以获得 [0,1.0) 范围内的浮点数的一致性.这里的 b 是浮点表示中的尾数位数。您无法生成随机浮点表示,因为这会在 IEEE749 双精度格式中出现偏差(在 [0,1.0 范围内的所有正浮点数中),小于五分之一在 [0.5 , 1.0) )
  • @AndrewMao:您在[0, 2^b) 中生成一个随机整数,然后浮点除以2^b - 1。 (iirc,mersenne 实现乘以预先计算的常数1.0/(2^b - 1),假设乘法比除法更快)。

标签: algorithm random stochastic


【解决方案1】:

如果您随机生成事件发生的概率,可能会发生什么?如果允许 0,则必须允许 1。

【讨论】:

    【解决方案2】:

    不能,弄清楚封闭区间何时有用,但开放结束区间似乎是唯一合理的使用方法。

    让我们抛硬币:

    如果你说rnd() < 0.5 是头,其余的是尾,如果你使用闭区间,你会得到比头更多的尾。还有多少尾巴取决于实际得到 1 的可能性。

    【讨论】:

      【解决方案3】:

      使用半开区间的一个令人信服的理由是您为某个数组选择随机数组索引的用例。当您从 [0, 1) 缩放到 [0, arrayLength] 中的整数时,永远不要获取值 arrayLength 很有帮助,因为在许多语言实现中这不是数组中的索引。例如,Java 和 ArrayIndexOutOfBoundsException。半开区间在这里就很方便了。

      具有闭区间 [0, 1] 的原因是 Albin 的概率论点。但值得注意的是,从数学上讲,在 [0, 1] 中选择任何特定随机数(包括 1)的概率为零。但是,对于伪随机数生成器,它会偶尔弹出。

      【讨论】:

      • 这些是整数,而不是浮点数。那里有很大的不同。为整数生成指定端点只是语义上的差异。此外,选择任何特定浮点数的概率不是 0,此外,如果您希望在 [0,1] 上均匀分布,它不能在所有可能的浮点数上均匀分布。
      • "不过,对于伪随机数生成器,它偶尔会弹出。" - 这不是它是伪随机的效果,而是它是有限精度的。该范围内的浮点数是有限的,但实数是无限的。
      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多