我有一个如下的随机数生成器。
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; // a
return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c
}
实际上,我希望在范围(0,1)内获得双倍数。一种选择是在我的代码中执行此操作。
#define M_RAN_INVM64 5.42101086242752217003726400434970855e-20
[..]
double u1;
u1 = next()*M_RAN_INVM64;
- 我担心失去精度并且这与平台有关。
- 我不想得到值为0或1。
一种选择是将next()转换为有符号长整型,乘以M_RAN_INVM64,然后加上0.5。然后我可以加上2^(64)/2来确保我永远不会得到0。
double d = your_unsigned_longlong * 1.0 / ULONG_LONG_MAX;
,然后过滤为0和1。 - The Paramagnetic Croissantunsigned long long
没有被定义为64位。它必须至少是64位。 - chux - Reinstate Monica