C++随机数的产生

本文详细介绍了C++中如何生成随机数,包括rand()函数的工作原理及其使用方法,srand()函数的作用以及如何利用当前时钟作为随机数种子。此外,还提供了生成特定范围内随机数的具体公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 随机数介绍

        计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)
        在C++中,rand()函数用来产生随机数,但是值得注意的是,rand()函数产生的随机数是一个伪随机数,是根据一个数(种子)为基准按照某个公式递推出来的一系列的数,这一系列的数符合正态分布的特征,从而产生了随机数,但并不是真正意义的随机数,因为种子是去确定的。

2 rand()函数的介绍

    功能:随机数发生器

    用法:int rand(void)

    所在头文件:<stdlib.h>
    rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。rand()返回一随机数值的范围在0至RAND_MAX根据其数据类型不同,而有不同的取值范围,比如:RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。

        当用户未设置随机数的种子时,随机数缺省的种子为1。由于rand()产生的是伪随机数,所以每次执行时是相同的,想要每次执行时不同,需要借助另外一个函数—srand()。

3 srand()函数的介绍   

        功能:初始化随机数发生器

        用法:void srand(usinged int seed)

        所在同文件:<stdlib.h>

        srand()函数用来设置rand()函数产生随机数时随机数的种子,参数seed值必须是一个整数,如果每次seed值都设置的相同,那么rand()函数产生的值就会一样,使用srand()函数可以将随机数的种子设置为不同值,这样,每次产生的随机数就会随种子的不同而不同。

4 常用-使用当前时钟作为随机数的种子

        正如前面所说的那样,如果种子相同,那么每次产生的随机数也是相同的,若希望每次产生的随机数不也一样,那么就要借助于srand()函数,它可以设置rand()函数的种子值,在平常我们使用的时候,通常采用当前时钟,利用srand(usinged int time(nullptr))的方法设置不用的随机数的种子,因为每时每刻的时间是不同的,这么一来,每次产生的随机数的种子就不一样,利用srand()函数产生的随机数就会不同。

5 产生随机数的方法

        产生随机数的方法过程可以描述为:1、给函数srand()一个种子值,他必须是 usinged int 类型;2、调用rand()函数产生随机数;3、如果需要想要多次获取随机数,可以多次调用rand()函数;4、利用rand()函数获取的随机数进行操作。注意:rand()函数只能产生0~RAND_MAX的值。

例:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main() {
	
	for (int i = 0; i < 10; i++) {   //随机数种子一定,每次运行产生的随机数是相同的
		cout << rand() << "\t";
	}
	cout << endl;

	//根据时间产生随机数的种子,将time(nullptr)产生的时间强制转化为unsinged类型
	srand(unsigned (time(nullptr))); 
	for (int i = 0; i < 10; i++) {   //种子不同,每次运行产生的随机数不同
		cout << rand() << "\t" ;
	}
	return 0;
}

6 产生特定范围的随机数的特定公式

        想要产生一定范围的随机数可以根据随机函数并利用一定的公式进行获取,下面整理了一些获取特定范围的随机数的一些公式:

        1、要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 

        2、要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a或者(rand() % (b-a))+ a + 1; 

        3、要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

示例:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main() {
	
	//根据时间产生随机数的种子,将time(nullptr)产生的时间强制转化为unsinged类型
	srand(unsigned (time(nullptr))); 
	//获取10个1-10的随机整数
	for (int i = 0; i < 10; i++) {
		cout << 1 + 1 + rand() % (10 - 1) << "\t";
	}
	cout << endl;

	//获取10个1-10的随机整数另一种写法
	for (int i = 0; i < 10; i++) {
		cout << 1 + rand() % (10 - 1 + 1) << "\t";
	}
	cout << endl;

	//获取10个0~1之间的小数
	for (int i = 0; i < 10; i++) {
		cout << rand() / double(RAND_MAX) << "\t";
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值