C++ 低32位包含什么:Seeding mt
C++ What is contained in the lower 32 bits: Seeding mt
我有一行代码使用高精度时钟的纳秒抓取来为 mersenne twister 伪随机数生成器播种。类似这样的事情:
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 位数字,还是因为这是小端字节序,最后会是随机的乱码吗?
非常感谢任何阅读建议或要点。
字节顺序与它无关。 "lower" 64 位值的 32 位是位 0-31,即值 1<<0 到 1<<31 的位。 IOW,低 32 位只是取值模 1<<32.
是的,对于一个时钟来说,这意味着采取快速变化的部分。
为了安全"downcasting",只需使用模除法:
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);
我有一行代码使用高精度时钟的纳秒抓取来为 mersenne twister 伪随机数生成器播种。类似这样的事情:
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 位数字,还是因为这是小端字节序,最后会是随机的乱码吗?
非常感谢任何阅读建议或要点。
字节顺序与它无关。 "lower" 64 位值的 32 位是位 0-31,即值 1<<0 到 1<<31 的位。 IOW,低 32 位只是取值模 1<<32.
是的,对于一个时钟来说,这意味着采取快速变化的部分。
为了安全"downcasting",只需使用模除法:
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);