繁体   English   中英

在C ++ 11中修复种子全局性<random>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM