C ++低32位包含的内容:种子mt

时间:2015-06-24 12:49:29

标签: c++ boost random casting mersenne-twister

我有一行代码,使用纳米秒针的高精度时钟来播种mersenne twister psudo-random数字生成器。有点像这样:

rng.seed(duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch().count());

我知道在boost中的mt只能接受32位整数(这就是seed()所采用的)并且这个持续时间转换为纳秒至少是64位(我也知道这段代码会导致转换警告可以使用static_cast来处理。

我的问题是当这个转换为32位整数时,这些位的内容是什么。我知道低32位是编译器从64位整数转换为32位整数时保留的位。我也在一台小端机器上。因为我知道以秒为单位的当前纪元时间是~1.4 * 10 ^ 9,那么低32位是否是纪元时间的前10位还是因为这是小端将是最后的随机胡言乱语?

非常感谢任何建议或阅读要点。

2 个答案:

答案 0 :(得分:1)

Endianness与它无关。 &#34;更低&#34; 64位值的32位是位0-31,即具有值1 <&lt; 0到1 <&lt; 31的位。 IOW,taing低32位只是取模1的值<&lt; 32。

是的,对于一个意味着采取快速变化的部分的时钟。

答案 1 :(得分:1)

对于安全的“向下转型”,只需使用模数除法:

int64_t nanoseconds = duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch().count()
int32_t seed = nanoseconds % std::numeric_limits<int32_t>::max();
rng.seed(seed);