使用WELL512获取某个范围内的随机实数

时间:2011-07-22 02:38:02

标签: c prng

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

如何使用此返回值在特定范围内生成随机实数 - 例如340.92491和859812.53198之间的浮点数。

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

3 个答案:

答案 0 :(得分:4)

嗯,数学上只是:

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 - 然后随机选择尾数。唔...

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用浮点数表示均匀分布的实数是完全不可能的 - 在您的范围内存在无数个实数,但只有有限数量的浮点数。

更糟糕的是,如果您的范围超过浮点指数边界,则您的范围内可表示为浮点数的有限数量的实数甚至可能无法均匀分布。