每次在c ++中调用随机函数

时间:2013-11-12 05:30:22

标签: c++ function random

我是C ++的新手,我只用了几个小时。

我想创建一个填充数组/向量的函数,其中随机值介于1到255之间(对于随机化的IP地址)。

我创造了这个:

vector<int> gen_ip_tuple(){

    int sh_rand;
    vector<int> vect_tuple;
    srand(time(NULL));  // initialize random seed
    for (int i = 0; i < 4; i++){
        sh_rand = rand() % 255 + 1;     // between 1 to 255
        cout << sh_rand << endl;
        vect_tuple.push_back(sh_rand);
    }   
    return vect_tuple;
}

如果被调用一次,效果会很好。

但如果我多次调用此函数,每次都会产生相同的4元组结果。

我不明白,因为我使用srand(time(NULL))来获得随机种子。

此种子在函数中设置,因此每次都必须是新的。


总结:

  • 每次程序重新运行4元组是随机的(与之前的运行不同)

    first run = {67,127,115,45}
    second run ={157,142,16,93}
    
  • 每次调用该函数时,它都会产生相同的结果。

    first call = {157,142,16,93}
    second call ={157,142,16,93}
                     ....
    

你有什么想法吗?

1 个答案:

答案 0 :(得分:6)

“srand(time(NULL))有一个随机种子”&lt; - 如果time(NULL)值已经改变,这只会给你一个不同的种子,这只会发生一次。如果你在一秒钟内调用你的函数4次,你会得到四个相同的结果集。

您应该将srand()设置移出gen_ip_tuple,可能会转移到main()功能中。程序的不同部分并不打算继续调用srand()

修改

  

我改变了srand(time(NULL)); to srand(time(NULL)+ rand());它运作良好。多谢你们。 - @ user1778354

随着随机性的发展,这是一种严重破碎的方法。它使rand()保证不再重复的时间段无效(在热门平台上为2 ^ 32),因此time(NULL) + rand()将更快地评估为已使用的srand()种子。即使rand()与加密哈希一样随机 - 而且距离它很远 - 风险也可能是“生日问题”,请参阅http://preshing.com/20110504/hash-collision-probabilities/ - 即25000次呼叫后约10%,50%之后50000个电话,150000个电话后90%。

我不知道您的计划会拨打gen_ip_tuple多少次,或者您是否认真随意地需要它,但是您的方法没有任何好处和严重问题。