[英]Fix seed globaly in c++11 <random>
我正在尝试将新的c++
<random>
标头与全局固定的种子一起使用。 这是我的第一个玩具示例:
#include <iostream>
#include <random>
int morerandom(const int seednum,const int nmax){
std::mt19937 mt;
mt.seed(seednum);
std::uniform_int_distribution<uint32_t> uint(0,nmax);
return(uint(mt));
}
int main(){
const int seed=3;
for (unsigned k=0; k<5; k++){
std::cout << morerandom(seed,10) << std::endl;
}
return 0;
}
所以问题是:如何将种子固定在main()
并从morerandom()
获得可复制的输出?
换句话说,我需要调用morerandom()
很多( k
会很大),但是这些随机数应始终使用相同的seed
绘制。 我想知道是否可以/更有效率地定义整个块:
std::mt19937 mt;
mt.seed(seednum);
在main内部,然后将mt
传递给morerandom()
。 我尝试过:
#include <iostream>
#include <random>
int morerandom(const int nmax)
{
std::uniform_int_distribution<uint32_t> uint(0,nmax);
return(uint(mt));
}
int main()
{
const int seed=3;
std::mt19937 mt;
mt.seed(seed);
for (unsigned k=0; k<5; k++)
{
std::cout << morerandom(10) << std::endl;
}
return 0;
}
但是编译器抱怨:
error: ‘mt’ was not declared in this scope return(uint(mt));
解决方案1
#include <iostream>
#include <random>
int morerandom(const int nmax, std::mt19937& mt)
// ^^^^^^^^^^^^^^^^
{
std::uniform_int_distribution<uint32_t> uint(0,nmax);
return(uint(mt));
}
int main()
{
const int seed=3;
std::mt19937 mt;
mt.seed(seed);
for (unsigned k=0; k<5; k++)
{
std::cout << morerandom(10, mt) << std::endl;
// ^^
}
return 0;
}
解决方案2
#include <iostream>
#include <random>
std::mt19937 mt;
// ^^^^^^^^^^^^^
int morerandom(const int nmax)
{
std::uniform_int_distribution<uint32_t> uint(0,nmax);
return(uint(mt));
}
int main()
{
const int seed=3;
mt.seed(seed);
for (unsigned k=0; k<5; k++)
{
std::cout << morerandom(10) << std::endl;
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.