【问题标题】:Getting a random real number in a certain range using WELL512使用 WELL512 获取一定范围内的随机实数
【发布时间】:2011-07-22 02:38:02
【问题描述】:

我正在使用this paper 中描述的 WELL512 伪随机数生成器函数。该函数返回一个随机的unsigned long 值。

我如何使用这个返回值来产生一个一定范围内的随机实数——比如介于 340.92491 和 859812.53198 之间的浮点数。

C rand() 函数的文档似乎警告不要使用 mod。

【问题讨论】:

标签: c prng


【解决方案1】:

嗯,从数学上讲就是:

min_value + (max_value - min_value) * (my_random() / (long double)ULONG_MAX)

(假设 my_random() 返回一个介于 0 和 ULONG_MAX 之间的均匀分布数)

但是,根据 min_valuemax_valueULONG_MAX 的确切值,某些浮点数几乎肯定会比其他数字更有可能。

通过这个公式,每个可能的随机无符号长映射到一个浮点数。但是由于min_valuemax_value 之间的不同浮点数的数量几乎可以肯定不完全是ULONG_MAX,所以一些无符号长整数将映射到相同的浮点数,或者一些浮点数将没有无符号长整数映射到它们或两者兼而有之。

解决这个问题以使结果真正统一是...非平凡的,我认为。也许有人比我读得更好。

[编辑]

或者看看这个问题的答案:

Generating random floating-point values based on random bit stream

该答案取决于 IEEE double 表示的内部结构。我也不确定我是否完全理解它的工作原理。

[编辑 2]

好的,现在我明白它是如何工作的了。这个想法是在最小值和最大值之间选择一个随机浮点表示,然后以与其指数表示的规模成反比的概率将其丢弃。因为对于均匀分布,(比如说)1/2 和 1 之间的数字需要是 1 和 2 之间的数字的一半,但是这些范围内的浮点表示的数量是相同的。

我认为您可以通过首先选择对数刻度上的指数来提高代码效率 - 例如,通过在随机选择的整数上使用 ffs - 然后随机选择尾数。嗯……

【讨论】:

    【解决方案2】:

    是否可以将实数转换为无符号长整数?如果这很容易做到,我认为 WELL512 有效。祝你好运。

    【讨论】:

      【解决方案3】:

      用浮点数表示均匀分布的实数是完全不可能的——在你的范围内有无数个实数,但浮点数是有限的。

      更糟糕的是,如果您的范围跨越浮点指数边界,您范围内可表示为浮点数的有限实数甚至可能不会均匀分布。

      【讨论】:

      • 您能否解释一下浮点指数边界的含义?我不熟悉这个概念。谢谢。 :-)
      • @Summer_More_More_Tea:它是浮点数范围内指数值变化的点——例如,从1.111....1111 * 2^41.000....0000 * 2^5。此时,两个相邻浮点数之间的差距加倍/减半。
      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多