0

我有一行代码使用高精度时钟的纳秒抓取来播种 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 位数字,还是因为这是小端序,所以最后会是随机的乱码吗?

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

4

2 回答 2

1

字节顺序与它无关。64 位值的“低”32 位是位 0-31,即具有值 1<<0 到 1<<31 的位。IOW,低 32 位只是取模 1<<32 的值。

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

于 2015-06-24T12:54:27.067 回答
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);
于 2015-06-24T12:58:05.730 回答