我是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}
....
你有什么想法吗?
答案 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
多少次,或者您是否认真随意地需要它,但是您的方法没有任何好处和严重问题。