【发布时间】: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