我正在使用中描述的 WELL512 伪随机数生成器函数这张纸 http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf。该函数返回一个随机数unsigned long
value.
如何使用此返回值生成特定范围内的随机实数 - 例如 340.92491 和 859812.53198(含)之间的浮点数。
C rand() 函数的文档似乎警告不要使用 mod。
嗯,从数学上来说就是:
min_value + (max_value - min_value) * (my_random() / (long double)ULONG_MAX)
(假设 my_random() 返回 0 到 ULONG_MAX 之间均匀分布的数字)
但是,具体取决于min_value
, max_value
, and ULONG_MAX
,某些浮点数几乎肯定比其他浮点数更有可能出现。
每个可能的随机 unsigned long 通过此公式映射到浮点数。但由于不同浮点数之间的数量min_value
and max_value
几乎可以肯定不完全是ULONG_MAX
,一些无符号长整型将映射到相同的浮点数,或者一些浮点数将没有无符号长整型映射到它们或两者。
我认为解决这个问题以使结果真正统一是很重要的。也许有人比我更擅长引用论文。
[edit]
或者看看这个问题的答案:
基于随机比特流生成随机浮点值 https://stackoverflow.com/questions/5015133/generating-random-floating-point-values-based-on-random-bit-stream
这个答案取决于 IEEE 的内部结构double
表示。我也不确定我是否完全理解它是如何工作的。
[edit 2]
好吧,现在我明白它是如何工作的了。这个想法是选择一个随机浮点表示介于最小值和最大值之间,然后以与其指数表示的规模成反比的概率将其丢弃。因为对于均匀分布,(例如)1/2 和 1 之间的数字的可能性需要是 1 和 2 之间的数字的一半,但这些范围内的浮点表示形式的数量是相同的。
我认为你可以通过首先选择对数刻度上的指数来使代码更有效 - 例如,通过使用ffs
随机选择的整数 - 然后随机选择尾数。嗯...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)