C++随机数

这篇博客介绍了C++中生成随机数的函数rand()和srand()。rand()通过线性同余法生成伪随机数,其默认种子为1,可使用srand()进行初始化以获得不同的随机序列。srand()通常结合time()函数使用,以当前时间作为种子确保每次运行的随机性。此外,还讲解了如何通过取模运算获取特定范围内的随机数,并给出了示例代码来展示如何生成不同区间的随机整数和浮点数。
摘要由CSDN通过智能技术生成

C++随机数

C++提供了两个函数,用于返回随机数:rand() 和 srand()

rand()

功能: 随机数发生器

用法:

// #include<stdlib.h>
int rand(void)

rand()的内部实现是用线性同余法做的,简单的讲就是通过类似于一个数学周期函数去生成一个数字。而这个周期又特别的长,所以在一定范围内可以看成是随机的。故单独使用rand()生成的随机数实际上是伪随机数。

当用户未设定随机数种子时,系统会默认随机数种子为1。随机数种子可以简单地理解成上面提到的数学周期函数的参数。

因为rand() 产生的是伪随机数字,每次执行时是相同的“周期函数”; 若要不同, 可以用函数 srand() 初始化它。换个简单的理解方式:srand()就是给“周期函数”添加了一个参数。

srand()

功能:

初始化随机数发生器

用法:

// #include<stdlib.h>
void srand(unsigned int seed)
    
/*
unsigned:无符号
表示抛弃数据类型的负数部分,将更多的存储空间用来存放非负数
例如:int类型原本占用4字节空间,即只能存储[-2^31,2^31 - 1]范围内的数据
加unsigned后存储数据的范围就是[0,2^32 - 1]

unsigned int表示[0,2^32 - 1]范围内的整型
*/

srand() 用来设置 rand() 产生随机数时的随机数种子。参数 seed 必须是个整数,如果每次 seed 都设相同值,rand() 所产生的随机数值每次就会一样。所以想要生成指定数量的随机数,就需要在每次使用rand()都使用srand()重新产生一个随机数种子。

使用time()作为随机数种子

功能:

时间戳,返回从1970年1月1月零点零分零秒到当前时间的秒数

用法:

// #include<time.h>
time_t time(time_t * t);    // 指针t用于存放返回的时间,可以传空指针

我们可以将time返回的时间作为参数传递给srand(),因为程序每一次运行时,我们的时间都是不一样的,即每次运行时的随机数种子都不一样。

srand((unsigned)time(NULL));
rand();

随机数范围计算

首先我们可以通过rand() % n的方式,获取到[0,n)的随机数,因为任何一个数除以n得到的余数0到n-1。那么我们就可以通过改变n的值就可以去指定截止数,再将取到的范围加上一个值就可以改变起始数:

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

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

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

int main() {
    // 生成随机数种子
    srand((unsigned)time(NULL));
    
    // RAND_MAX 是 rand() 函数能够产生的最大随机数
    cout << "RAND_MAX:" << RAND_MAX << endl;
    
    int a = 1, b = 10;
    // 生成[a,b)的随机数
    cout << (rand() % (b-a)) + a << endl;
    
    // 生成[a,b]的随机数
    cout << (rand() % (b-a+1)) + a << endl;
    
     // 产生(a, b] 的随机数,可以使用(rand() % (b - a)) + a + 1;
 	cout << (rand() % (b - a)) + a + 1 << endl;
    
    // 产生[0, 1] 的浮点数,可以使用 rand() / double(RAND_MAX);
 	cout << rand() / double(RAND_MAX) << endl;
    
    return 0;
}
  • 27
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值