使用32位Mersenne Twister生成64位值

Mor*_*xes 6 c++ random boost c++11

根据这个Boost文档页面,Mersenne Twister的64位变体比它的32位变体慢得多(这很有意义).据我了解,C++ 11中引入的许多功能,包括随机数生成,在标准库中基本上都是Boost.这让我相信标准C++中的32位MT性能也更好.

我正在写一个光线跟踪器(主要是为了好玩),速度是我最关心的问题之一.基本上所有数值都表示为双精度浮点数.我的问题是,由于32位MT速度要快得多,我可以用它来生成双打吗?我可以期待哪些缺点(精度损失,性能等)?

Cor*_*ica 2

为此,我添加了一个您没有提到的假设:我假设您对每双进行一次随机抽奖。显然,通过两次抽奖可以获得两倍的随机性。

第一个问题实际上是“32 位伪随机性对于我的光线追踪器来说是否具有足够的随机性”。我的猜测是肯定的。大多数光线追踪器仅发射几百万条光线,因此您不会注意到只有 40 亿位伪随机性。

第二个问题是“我可以在我关心的双值域中分配伪随机性吗?” 再说一遍,我的猜测是肯定的。如果您在 90 度视场中发射光线,则一次伪随机绘制可能有 40 亿种结果。从角度来看,狙击手通过高倍瞄准镜看到的角度精度比这些伪随机向量之间的平均差低数百万倍。

话虽如此,请分析您的代码。我认为您的光线跟踪代码本身花费的时间比伪随机生成的时间长得多,除非您的场景全部由单个非反射球体组成,否则有 99.9998%可能性

  • 啊,那就别介意我说的话了。mt19937 与 mt19937_64 的后果没有比您依赖编译器为您定义uniform_real_distribution这一事实更重要的了。您将无法检测到它们之间结果的差异。当您开始关心 PRNG 的输出如何映射到 [0,1) 时,所有差异都会显现出来。 (2认同)
  • @MoreAxes - CortAmmon 所说的。`uniform_real_distribution` 将从 `mt19937` 中提取尽可能多的 32 位值,因为它需要生成一个均匀分布的双精度值。这一切都为您实现了。 (2认同)