【发布时间】:2014-07-16 00:33:24
【问题描述】:
在维基百科上,我发现了以下random number generator:
#include <stdint.h>
/* The state must be seeded so that it is not everywhere zero. */
uint64_t s[ 2 ];
uint64_t next(void) {
uint64_t s1 = s[ 0 ];
const uint64_t s0 = s[ 1 ];
s[ 0 ] = s0;
s1 ^= s1 << 23;
return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0;
}
现在,当实施时(使用 s[0] 和 s1 的随机种子),这很好用,但输出的数字如下:
2318509732609079156, 5455176535758408500, 14446583927462861784, 3420274542024626201, etc.
我现在的问题是:如何将这些数字转换为均匀的实数分布 [0,1[,即包括 0 和排除 1?
【问题讨论】:
-
只需将整数随机数除以2.0^64
-
在 C++11 中有一个完整的库:<random>。你自己有这样做的理由吗?
-
我推荐这个关于 C++11 中随机生成器的讨论:channel9.msdn.com/Events/GoingNative/2013/…;获得正确的随机数很难。
-
是的@DmitryLedentsov,速度。我特别选择了这个算法,因为它被认为是最快的随机数引擎之一。我正在编写一个程序,其主要速度瓶颈是随机数生成,因此与 Mersenne Twister 或 Lagged Fibonnaci 生成器一样快,它们仍然比这个慢。
-
@PeterG。非常感谢,这似乎已经成功了! (至少,乍一看)。但请问:你怎么知道这是除数?
标签: c++ random distribution