c ++ - default_random_engine始终创建相同系列的数字

时间:2014-04-07 08:41:33

标签: c++ random

我正在使用神经网络,我想随机创建权重。因此,如果我创建30个神经网络,每个神经网络最终都具有相同的权重(应该是随机的),所以当我给它们所有相同的输入时,输出是相同的,当它不应该时。有什么帮助吗?

这是主要功能

int main(){
std::vector<Improved_NN> v;
std::random_device rd;
std::default_random_engine generator(rd());
std::uniform_real_distribution<double> distribution(-1.0,1.0);
for(int i = 0; i < 30; i++)
{
    Improved_NN temp;
    temp.initialize_weights(generator, distribution);
    v.push_back(temp);
}

Board temp;

for(int i = 0; i < 30; i++)
{
    std::cout <<"\n" << v[i].executeFromExternal(temp);
}

而且initialize_weights就在这里:

 void Improved_NN::initialize_weights(std::default_random_engine gen,std::uniform_real_distribution<double> dist){
int k,v = 0;
for(k = 0;k<NUM_HIDDEN_1;k++){
    for(v = 0 ; v < NUM_INPUTS; v++){
        mlp_t.w_h1_i[k][v]=dist(gen);
        //std::cout<<mlp_t.w_h1_i[k][v]<<std::endl;
    }
}
for(k = 0;k<NUM_HIDDEN_2;k++){
    for(v = 0 ; v < NUM_HIDDEN_1; v++){
        mlp_t.w_h2_h1[k][v]=dist(gen);
        //std::cout<<mlp_t.w_h2_h1[k][v]<<std::endl;
    }
}
for(k = 0;k<NUM_HIDDEN_3;k++){
    for(v = 0 ; v < NUM_HIDDEN_2; v++){
        mlp_t.w_h3_h2[k][v]=dist(gen);
        //std::cout<<mlp_t.w_h3_h2[k][v]<<std::endl;
    }
}
    for (int a = 0 ; a < NUM_HIDDEN_3;a++){
        mlp_t.w_o_h[0][a] = dist(gen);
        //std::cout<<mlp_t.w_o_h[0][a]<<std::endl;
    }
}

这是我每次执行时得到的输出。

0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458 0.521458

非常感谢。

3 个答案:

答案 0 :(得分:7)

好吧,就像普通的旧rand()一样,你需要为生成器提供初始种子,它必须是不同的值,以便生成器生成不同的序列:

    std::random_device rd;
    std::default_random_engine generator(rd());

另外,正如user3018144指出的那样,使用单个生成器,而不是30个不同的:

int main(){
    std::vector<Improved_NN> v;
    std::random_device rd;
    std::default_random_engine generator(rd());
    std::uniform_real_distribution<double> distribution(-1.0,1.0);

    for(int i = 0; i < 30; i++)
    {
        Improved_NN temp;

        /*Problem is here*/
        temp.initialize_weights(generator, distribution);
        v.push_back(temp);
    }

    Board temp;

    for(int i = 0; i < 30; i++)
    {
        std::cout <<"\n" << v[i].executeFromExternal(temp);
    }


//for the number of generations, do this....
}

另外,就在这里:

 void Improved_NN::initialize_weights(std::default_random_engine gen,std::uniform_real_distribution<double> dist){

您按值传递生成器,这将创建现有生成器的副本。通过引用传递:

 void Improved_NN::initialize_weights(std::default_random_engine& gen, std::uniform_real_distribution<double>& dist){

答案 1 :(得分:1)

documentation of <random>中,声明必须bind发布器#include <functional> #include <iostream> #include <random> int main(int argc, char *argv[]) { std::default_random_engine rd; std::uniform_real_distribution<double> distribution(-1.0, 1.0); auto weight = std::bind(distribution, rd); for (int i = 0; i < 30; ++i) { std::cout << weight() << " "; } return 0; } 才能重新使用它。

这是一个小例子:

weight

通过将initialize_weights(通过引用,如@NemanjaBoric所注意到的)传递给c++ main.cpp -o rands -std=c++11 && ./rands -0.736924 -0.0826997 -0.562082 0.357729 0.869386 0.0388327 -0.930856 0.0594004 -0.984604 -0.866316 0.373545 0.860873 0.0538576 0.307838 0.402381 0.524396 -0.905071 -0.343532 0.512821 -0.269323 0.965101 0.506712 -0.854628 0.769414 -0.127177 -0.0445365 -0.450186 -0.666986 0.795313 -0.878871 方法,您可以根据自己的情况进行调整。

以下是如何编译和运行:

{{1}}

答案 2 :(得分:0)

尝试:

 std::random_device mch;
 std::default_random_engine generator(mch());
 std::normal_distribution<double> distribution(0.0, 1.0);