1. 2分钟学会使用随机数函数,避免使用误区
产生随机数一般把void srand (unsigned seed)和int rand(void)结合使用。
srand函数用来设置产生一系列伪随机数发生器的起始点,而rand函数则用这个起点来产生随机数。所以一般代码是这样写的
void func() {
unsigned int seed = 0;
srand(seed);
for (int i = 0; i < 10; ++i) {
cout << rand() << endl;
}
}
种子seed做为起点每次都是0,所以每次func方法rand函数产生的伪随机数都是一样的。
为了每次伪随机数都不同,且将随机值限定在一定范围我们会写出如下代码
void func() {
//每次执行时间不同,将时间做为种子,可以做到每次伪随机数产生起点不同
unsigned int seed = time(NULL);
srand(seed);
for (int i = 0; i < 5; ++i) {
//将随机值限定在0-99范围
cout << rand() % 100 << endl;
}
}
但是,切记一般不要把srand函数写在循环内。有时候我们会写下下面的代码,fuc2函数调用func函数,运行可以发现每次产生的随机数组都相同。
因为程序执行很快,每次时间可以说是相同的,造成种子没有变化,伪随机数起点没变。
//把设置种子写循环内,造成了每次产生的随机数组都相同
void func() {
srand(time(NULL));
for (int i = 0; i < 5; ++i) {
cout << rand() % 100 << " ";
}
cout << endl;
}
void func2() {
for (int i = 0; i < 10; ++i) {
func();
}
}
因此如果多个函数嵌套调用发现每次执行随机数组没变,可以检查下srand函数上层是否存在循环。
最后, 觉得文章对你有用的话,右侧边栏点个打赏吧 !