c -使用WELL512在一定范围内获得随机实数



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

我如何使用这个返回值在一定范围内生成一个随机实数-就像在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_valuemax_valueULONG_MAX的确切值,一些浮点数几乎肯定比其他浮点数更可能出现。

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

修复这个使结果真正统一是…我认为这很重要。也许有人比我更有学问,可以引用一篇论文。

[编辑]

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

基于随机比特流生成随机浮点值

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

[编辑2]

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

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

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

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

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

最新更新