1

我是 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;
}

如果它被调用一次,它会很好地工作。

但是如果我多次调用这个函数,每次都会产生相同的四元组结果。

我不明白,因为我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}
                     ....
    

你有什么主意吗?

4

1 回答 1

6

"srand(time(NULL)) to have a random seed" <-- 如果time(NULL)值发生变化,这只会给你一个不同的种子,这只会每秒发生一次。如果你在一秒内调用你的函数 4 次,你会得到四个相同的结果集。

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

编辑

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

随着随机性的发展,这是一种严重破坏的方法。它使rand()否则保证不会重复的时间段(在流行平台上为 2^32)无效,因此time(NULL) + rand()srand()更早地评估已经使用的种子。即使rand()像加密哈希一样随机-而且远非如此-风险将根据“生日问题”,请参阅http://preshing.com/20110504/hash-collision-probabilities/-即〜10%之后25000 次呼叫,50000 次呼叫后 50%,150000 次呼叫后 90%。

我不知道您的程序会调用多少次gen_ip_tuple,或者您对它的随机需求有多严重,但是您的方法没有任何好处和严重的问题。

于 2013-11-12T05:32:23.207 回答