【C++】产生随机数 rand 和 srand 函数用法详解

本文介绍了C++中生成随机数的方法,包括使用rand()函数生成伪随机数,通过srand()设置种子确保不同运行的随机性,利用time()函数获取当前时间作为种子以避免重复,以及如何限制随机数的范围以满足特定需求。
摘要由CSDN通过智能技术生成

1. rand()

C++ 库有一个名为 rand() 的函数,每次调用该函数都将返回一个非负整数。要使用 rand() 函数,必须在程序中包含 <cstdlib> 头文件。
以下是其用法示例:

randomNum = rand();

但是,该函数返回的数字其实是伪随机数。这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是用算法生成的。
该算法需要一个起始值,称为种子,以生成数字。如果没有给出一个种子或者种子相同,那么它将在每次运行时产生相同随机数的数字流。
例如:

#include <iostream>
#include <cstdlib> // rand所需头文件
using namespace std;
int main()
{
    // 输出随机数
    cout << rand() << " ";
    cout << rand() << " ";
    cout << rand() << endl ;
    return 0;
}

执行多次,其输出结果都是:41 18467 6334

2. srand()

要在每次运行程序时获得不同的随机数字流,则必须为随机数生成器提供一个种子以开始。在 C++ 中,这是通过调用 srand() 函数完成的。
在 rand 被调用之前,srand 函数要先被调用,并且 srand 在整个程序中仅被调用一次。

#include <iostream>
#include <cstdlib> //rand和srand所需头文件
using namespace std;
int main()
{
    unsigned seed; //用于保存种子的变量seed必须是非负整数unsigned类型,这是srand函数在调用时期望接收的数据类型。
    cout << "Enter a seed value: ";
    cin >> seed;
    srand(seed);  //在调用rand()之前设置随机生成器种子
    cout << rand() << " ";
    cout << rand() << " ";
    cout << rand() << endl;
    return 0;
}

第1次运行结果:
Enter a seed value: 6
58 6673 30119
第2次运行结果:
Enter a seed value: 16
90 15854 12153
第3次运行结果:
Enter a seed value: 6
58 6673 30119
可以看出,输入不同的种子数会得到不同的随机数。若输入的种子数相同,则随机数也相同。

3. time()产生随机种子

实际中,不可能在每次获得随机数时都需要自己输入种子数,这样显得非常麻烦。获取种子值的另一个常见做法是调用 time 函数,它是 C++ 标准库的一部分。
time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。
请注意,在调用time 函数时必须给它传递一个参数 0。
同时程序中包含一个新的头文件 <ctime>,此头文件是使用 time 函数所必需的。

#include <iostream>
#include <cstdlib> 
#include <ctime>  // time所需头文件
using namespace std;
int main()
{
    unsigned seed;  
    seed = time(0);
    srand(seed);
    cout << rand() << " " ;
    cout << rand() << " " ;
    cout << rand() << endl;
    return 0;
}

输出结果:30197 21708 12669

4. 限制随机数的范围

有时程序需要一个特定范围内的随机数。要将随机数的范围限制在 1 和某个最大值 max 之间的整数,可以使用以下公式:

number = rand() % max + 1;

例如,要生成 1〜6 的随机数来代表骰子的点数,则可以使用以下语句:

num = rand() % 6 + 1;

原理:求余数运算符(%)可以获得整除之后的余数。当使用通过 rand 函数返回的正整数除以6时,余数将是 0〜5 的数字。因为目标是 1〜6 的数字,所以只需要给余数加 1 即可。

扩展到任意范围内的随机数,其通用公式如下:

number = (rand()%(maxValue - minValue +1)) + minValue;

在上述公式中,minValue 是范围内的最小值,而 maxValue 则是范围内的最大值。

例如,要获得 10〜18 的随机数,可以使用以下代码给变量 number 赋值:

const int MIN_VALUE = 10;
const int MAX_VALUE = 18;
number = rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE;

在上述代码中,(MAX_VALUE - MIN_VALUE + 1)的值为 9,这是目标范围内整数的个数。余数运算符(%)返回的值是 0〜8 的数字,再用它加上 MIN_VALUE(也就是 10),即可获得 10〜18 的随机数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值