每次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)个互不重复的随机数:



 
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值