[记录]你需要知道的C++问题

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函数上层是否存在循环。

最后, 觉得文章对你有用的话,右侧边栏点个打赏吧 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章