C 使用WELL512获取特定范围内的随机实数

C 使用WELL512获取特定范围内的随机实数,c,prng,C,Prng,我正在使用中描述的WELL512伪随机数生成器函数。该函数返回一个随机无符号long值 如何使用此返回值生成特定范围内的随机实数-例如介于340.92491和859812.53198(含340.92491和859812.53198)之间的浮点数 C rand()函数的文档似乎警告不要使用mod。是否可以将实数转换为无符号long?如果这很容易做到的话,我认为这很有效。祝你好运。从数学上讲,它只是: min_value + (max_value - min_value) * (my_random(

我正在使用中描述的WELL512伪随机数生成器函数。该函数返回一个随机
无符号long

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


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

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

从数学上讲,它只是:

min_value + (max_value - min_value) * (my_random() / (long double)ULONG_MAX)
(假设my_random()返回一个均匀分布的数字,介于0和ULONG_MAX之间)

但是,根据
min\u value
max\u value
ULONG\u max
的精确值,一些浮点数几乎肯定比其他浮点数更可能出现

通过这个公式,每个可能的随机无符号长映射到一个浮点。但是,由于
min\u value
max\u value
之间的不同浮点数的数量几乎肯定不完全是
ULONG\u max
,因此一些无符号长数将映射到相同的浮点数,或者一些浮点数将没有无符号长数映射到它们,或者两者都没有

修复此问题以使结果真正一致是。。。我想这不是小事。也许有人比我能引用一篇论文读得更好

[编辑]

或查看此问题的答案:

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

[编辑2]

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


我认为你可以通过首先选取对数尺度上的指数来提高代码的效率——比如,对随机选择的整数使用
ffs
,然后随机选取尾数。嗯..

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


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

可能重复的。请您进一步解释一下浮点指数边界的含义好吗?我不熟悉这个概念。谢谢。:-)@Summer\u More\u Tea:它是浮点范围内的一个点,在这个点上,指数值发生变化-例如,从
1.111…1111*2^4
1.000…0000*2^5
。此时,两个相邻浮点数之间的间隙加倍/减半。