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

C++ What is contained in the lower 32 bits: Seeding mt

本文关键字:种子 mt 32位 包含 C++      更新时间:2023-10-16

我有一行代码,它使用高精度时钟的纳秒抓取来为mersenne twister psudo随机数生成器种子。大致如下:

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

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

我的问题是,当它转换为32位整数时,这些位的内容是什么。我知道,当从64位整数转换为32位整数时,编译器会保留低32位。我也在一台小型endian机器上。由于我知道以秒为单位的当前历元时间是~1.4*10^9,那么低32位是历元时间的前~10位吗?或者由于这是小字节序,它会是末尾的随机胡言乱语吗?

任何建议或阅读要点都将不胜感激。

Endianness与此无关。64位值的"低"32位是0-31位,即值为1<lt;0到1<lt;31.IOW,获取较低的32位只是取取值模1<lt;32.

是的,对于一个时钟来说,这意味着要承担快速变化的部分。

为了安全的"下行广播",只需使用模除法:

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);