每次rand出来都是41?说好的随机数呢?!

rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个“伪随机”整数,理论上可以产生的最大数值为2^16-1,即32767。

rand()函数不接受参数,默认以1为种子(seed,即起始值),这里的种子在随机数产生的过程中起了很大的作用,甚至可以说是起了决定性的作用。

rand()=41?

了解了这些让我们试着生成一个随机数
#include<iostream>

using namespace std;

int main(int argc,char*argv[])
{
	int randValue=rand();
	cout<<randValue<<endl;
	system("pause");
}



第1次运行,输出41,第2次运行,输出41,第3、4……次输出仍然是41!说好的rand()产生一个0~32767间的随机整数呢? 
这里就遗漏了上边提到的“种子”的概念,计算机从算法层面,不可能产生真正的随机数,它只能按照一定的算法定义,生成一系列固定顺序的伪随机数,这就是所谓随机中的规律。rand()函数的实现可以抽象描述成这样:

int rand()
{
	static int seed=XX;
	return seed=A*seed+B*n;
}

这里的A、B、n都是常量值,所以这就意味着rand()产生的随机数就唯一取决于种子seed的值,在我们没有定义初始值的情况下,系统默认给出seed值为1,这就是为什么每次rand出来的值固定都是41的原因。

如果想生成一系列随机数,仍然可以这样:

#include<iostream>

using namespace std;

int main(int argc,char*argv[])
{
	int randValue[10];
	for(int i=0;i<10;i++)
	{
		randValue[i]=rand();
		cout<<randValue[i]<<endl;
	}
	system("pause");
}

生成10个随机数:



其实这10个数的值和排列顺序是固定的,即你知道了这开头,你也可以猜到这结尾。
要想打破这一规律,可以使用种子发生器。

srand()种子生成器

既然种子这么重要,如何定义种子呢?答案是使用C++中另一个为rand()而生的函数—srand()。
srand()可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数序列也会相同,比较理想的是使用随时会变化的数,常用时间作为随机数生成器的种子。

#include<iostream>
#include <time.h>

using namespace std;

int main(int argc,char*argv[])
{
	int randValue[10];
	srand(time(0));
	cout<<"本次所用种子为: "<<time(0)<<endl;
	for(int i=0;i<10;i++)
	{
		randValue[i]=rand();
		cout<<randValue[i]<<endl;
	}
	system("pause");
}

time(0)的值是从1970年1月1日开始到程序被运行时刻的总秒数。



如何生成0~N间(N-1)个互不重复的随机数?


#include<iostream>
#include <time.h>
#include<vector>

using namespace std;
//定义需要生成的随机数数量
#define Number 15  

void Randarrary( vector<int>& arrarInt) ;
int main(int argc,char*argv[])
{
	vector<int> arrarInt;
	for(int i=0;i<Number;i++)
	{
		arrarInt.push_back(i);
	}
	Randarrary(arrarInt);
	for(int i=0;i<Number;i++)
	{
		cout<<"第 "<<i<<" 个不重复的随机数是"<<arrarInt[i]<<endl;
	}
	system("pause");
}

//*******************************************************************//  
//生成N个互不重复的随机数函数 
//*******************************************************************//  
void Randarrary( vector<int>& arrarInt)  
{  
	for(int i=0;i<arrarInt.size();i++)  
	{  
		srand(int(time(0)));  
		int a=rand()%(arrarInt.size()-i)+i;  
		swap(arrarInt[i],arrarInt[a]);  
	}  
}

首先定义一个包含N个int类型元素的向量arrayInt,以0为第一个元素,从小到大依次排列,调用随机函数Randarrary后,依次把每次生成的随机元素跟参与随机运算的第一个元素对调。函数调用的结果是arrayInt向量内保存了0~N内的(N-1)个互不重复的随机数:



 
原文地址:https://www.cnblogs.com/mtcnn/p/9411999.html