C++低32位中包含的内容:种子mt
C++ What is contained in the lower 32 bits: Seeding mt
我有一行代码,它使用高精度时钟的纳秒抓取来为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);
相关文章:
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 从给定种子生成相同的随机数序列C++
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 为什么在Visual Studio的OpenCV项目中使用/MT时仍然需要dll?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 使用给定种子生成的随机数序列是否保证在标准版本中相同?
- 在编译时生成某种子类/类型注册表?
- libtorrent是否支持带摘要身份验证的http web种子
- 我应该使用std::seed_seq来种子std::mt19937吗
- 除了 rand() 之外,是否有任何随机生成器库,开发人员可以手动设置种子?
- 随机数生成器的种子和状态有什么区别?
- 如果我在每个平台上使用相同的种子,随机结果会相同吗?
- C++多个实例的随机数生成器组种子中增强
- MSVCP140.dll尽管设置了 /MT 运行时库
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- PRNG种子到底是什么,它在c ++中是如何工作的?
- 致命错误LNK1104:无法打开文件"libboost_log-vc141-mt-gd-1_64.lib"
- 如何改变高斯分布(提升)中的种子
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃
- C++低32位中包含的内容:种子mt