生成随机数c/c++

生成随机数

生成随机数的方法是运用time()、srand()和rand()来配合生成。

time()
在<time.h>中
原型: time_t time(time_t *seconds)
作用: 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。

rand()
<stdlib.h>
原型: int rand(void)
作用: 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

rand()是根据一个种子值来产生生随机数的。随机数的产生也和rand()的调用次数有关。
一开始的种子值是电脑开机时就产生的一个数值,下次开机这个数值会变动。如果不改变种子的值,那么电脑在不重启的条件下,每次用rand()产生的数值都是相同的。所以要改变种子值。

srand()
<stdlib.h>
原型: void srand(unsigned int seed)
作用: 播种由函数 rand 使用的随机数发生器。

先用srand(time(NULL))来对随机数发生器进行初始化。也就是重新播种。这样每次运行程序时,种子值是不同的。这样再调用rand()便可生成随机数。

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
	int x;
	srand(time(NULL));
	x = rand();
	cout << "x="<<x<<"\n";
	return 0;
}

输出
第一次:
在这里插入图片描述
第二次:
在这里插入图片描述
可以通过取余来达到生成某一范围内的随机数。

如果要连续生成随机数,那么要注意。因为播种是通过time()作为参数来进行的,这与程序运行时的时间有关。如果播种在循环里面。
列如:

int main()
{
	int x;
	for (int i = 0; i < 10; i++) {
		srand(time(NULL));
		x = rand();
		cout << "x=" << x << "\n";
	}
	return 0;
}

输出:
在这里插入图片描述
发现生成的数都是一样的。因为循环执行的很快,所以用time()返回的值差距非常小,几乎一样。所以每次循环播的种子值是相同的。要连续输出随机数的话有两种比较简单的改法。
1.使rand()的调用次数发生变化。
上面的例子中srand()会重置rand()的调用次数。所以,rand()都是首次调用。而随机数的产生又与rand的调用次数有关。便可知道把srand()放到循环外面就可以实现想要的效果。

int main()
{
	int x;
	srand(time(NULL));
	for (int i = 0; i < 10; i++) {	
		x = rand();
		cout << "x=" << x << "\n";
	}
	return 0;
}

输出:
在这里插入图片描述
2.改变种子的值
把srand()里的参数改成time()+rand()
这样就可以使得每次参数的值都不同。

int main()
{
	int x;
	for (int i = 0; i < 10; i++) {	
		srand(time(NULL) + rand());
		x = rand();
		cout << "x=" << x << "\n";
	}
	return 0;
}

输出:
在这里插入图片描述
其实这种方法生成的随机数都是伪随机数。因为和当时的时间和rand()的调用次数有关。只要数值能够确定,就可以通过计算得到生成的随机数。所以,这并不是绝对的随机数。

文章可能存在一些问题,请大家多多包涵。我也只是一名学生,这只是分享我之前学过的一些知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值