我有一行代码,使用纳米秒针的高精度时钟来播种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位还是因为这是小端将是最后的随机胡言乱语?
非常感谢任何建议或阅读要点。
答案 0 :(得分:1)
是的,对于一个意味着采取快速变化的部分的时钟。
答案 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);