我有一个带有意外输出的简单 C++ 程序:
#include<random>
#include<iostream>
#include "boost/random/mersenne_twister.hpp"
#include "boost/random/uniform_int_distribution.hpp"
int main(){
std::cout << sizeof(std::mt19937) << std::endl;
std::cout << sizeof(std::mt19937_64) << std::endl;
std::cout << sizeof(boost::random::mt19937) << std::endl;
std::cout << sizeof(boost::random::mt19937_64) << std::endl;
}
5000
2504
2504
2504
我发现有趣的是,mt19937(32bit one)的 sizeof 标准实现大约是 boost 版本的 2 倍,而 64bit 则完美匹配。
由于 MT 占用了大量空间,因此差异并不小。
同样奇怪的是,严格指定的算法的实现会有如此不同的 sizeof,我们不是在谈论 std::string 实现者可能会选择不同的 SSO 缓冲区大小......
我最好的猜测是 boost 要么有一个错误,要么它实现了一些稍微不同的 mt19937 版本,但维基百科这样说,暗示 boost 可能是正确的:
相对较大的状态缓冲区,2.5 KiB,
编辑:boost和std版本似乎都满足第1000个生成值是4123659995的要求,所以boost中似乎没有错误。