这个问题之前提出过(stackoverflow),但是(被接受的)回答并不令人满意。
以下示例保存和加载状态,但是根据生成的值数量,它可能有效也可能无效:
使用这些参数,它的运行方式就像预期的那样。然而,如果我将
为什么断言没有生效?现在我设置了
如果我将
在Linux上通过GCC5.4.0和CLANG3.8.0进行测试。
以下示例保存和加载状态,但是根据生成的值数量,它可能有效也可能无效:
#include <fstream>
#include <iostream>
#include <random>
#include <cassert>
int main()
{
const int preN = 4;
const int middleN = 0;
// initialize randGen
std::mt19937 randGen1;
std::normal_distribution<double> distribution1;
// print some initial random numbers
for (int i=0;i<preN;++i)
std::cout << distribution1(randGen1)<<" ";
// save state
std::cout << std::endl << "Saving...\n";
{
std::ofstream fout("seed.dat");
fout << randGen1;
}
// maybe advance randGen1
for (int i=0;i<middleN;++i)
std::cout << distribution1(randGen1)<<" ";
// load saved state into randGen2
std::cout << std::endl << "Loading...\n";
std::ifstream fin("seed.dat");
std::mt19937 randGen2;
fin >> randGen2;
std::normal_distribution<double> distribution2;
// are both randGen equal?
assert(randGen1 == randGen2);
// print numbers from both generators
std::cout << "Generator1\tGenerator2\n";
std::cout << distribution1(randGen1) << "\t"
<< distribution2(randGen2) << "\n";
return 0;
}
使用这些参数,它的运行方式就像预期的那样。然而,如果我将
preN=3
设置,输出看起来像这样:0.13453 -0.146382 0.46065
Saving...
Loading...
Generator1 Generator2
-1.87138 0.163712
为什么断言没有生效?现在我设置了
preN=3
和middleN=1
,输出结果为:0.13453 -0.146382 0.46065
Saving...
-1.87138
Loading...
Generator1 Generator2
0.163712 0.163712
如果我将
middleN
设为大于1的任何值,则会应用断言。有人能解释一下发生了什么吗?我做错了什么或者没有理解到位吗?在Linux上通过GCC5.4.0和CLANG3.8.0进行测试。
normal_distribution
可能有状态,也可能没有状态。这完全取决于实现算法的选择。 - T.C.