当前位置:   article > 正文

【C++】random随机数与【C++11】/rand()和srand()的用法_c++ random

c++ random

随机数

C++ 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。

随机数字常用于许多不同类型的程序中,以下是一些示例:
计算机游戏通常要使用随机数字来模拟一些随机过程,例如掷骰子或发牌。
模拟程序使用随机数字来决定后续将要发生的一系列操作或人与动物等的行为。可以创建使用随机数字的公式以确定特定事件在程序中出现的时间。
数据分析程序可能会使用随机数字随机选择要检验的数据。
计算机安全系统使用随机数字来加密敏感数据。

我们知道,C 中的随机数函数只有一个 rand( ) ,想生成某一区间范围内的随机数乃至随机的浮点数都十分麻烦。

而 C++11 中提供的 random 库解决了这一问题,它能让我们方便地生成需要的随机值。

下面将介绍如何利用 random 库中的组件生成符合条件的随机数。

random 库中的组件分为两类——随机数引擎类和随机数分布类。

随机数引擎类是可以独立运行的随机数发生器,它以均匀的概率生成某一类型的随机数,但无法指定随机数的范围、概率等信息。因此,它也被称为“原始随机数发生器”,由于不能指定生成随机数的范围,它通常不会被单独使用。

随机数分布类是一个需要于随机数引擎类的支持才能运行的类,但是它能根据用户的需求利用随机数引擎生成符合条件的随机数,例如某一区间、某一分布概率的随机数。

所有随机数引擎类都支持的操作如下:
在这里插入图片描述

1. c++ 11 random随机数的使用(推荐使用)

常用的随机数类如下:

default_random_engine:随机非负数(不建议单独使用)。
uniform_int_distribution:指定范围的随机非负数。
uniform_real_distribution:指定范围的随机实数。
bernoulli_distribution:指定概率的随机布尔值。
事实上,random 库的功能极其丰富,其中的随机数引擎不止有 default_random_engine 一个,分布类也远远不止上述三个。它还能进行泊松分布、正态分布、抽样分等高级的随机数功能,想详细了解这些内容请去查阅其他资料。我可能要等好久才能把这些内容补上。
详细参考:资料

1.1
1.2
1.3
1.4

2.1 C++中随机函数rand()和srand()的用法(老本版)

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

random_num = rand();
  • 1

但是,该函数返回的数字其实是伪随机数。这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是用算法生成的。

该算法需要一个起始值,称为种子,以生成数字。如果没有给出一个种子,那么它将在每次运行时产生相同的数字流。下面的程序说明了这一点:

#include <iostream>
#include <cstdlib>// Header file needed to use rand
using namespace std;
int main()
{
    // Generate and printthree random numbers
    cout << rand() << " ";
    cout << rand() << " ";
    cout << rand() << endl ;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
第1次运行输出结果:
41 18467 : 6334
第2次运行输出结果:
41 18467 6334
  • 1
  • 2
  • 3
  • 4

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

在 rand 被调用之前,srand 函数要先被调用,并且 srand 在整个程序中仅被调用一次。

#include <iostream>
#include <cstdlib> // Header file needed to use srand and rand
using namespace std;
int main()
{
    unsigned seed;  // Random generator seed
    // Get a nseed" value from the user
    cout << "Enter a seed value: ";
    cin >> seed;
    // Set the random generator seed before calling rand()
    srand(seed);
    //Now generate and print three random numbers
    cout << rand() << " ";
    cout << rand() << " ";
    cout << rand() << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
第1次运行结果:
Enter a seed value: 19
100 15331 - 209
第2次运行结果:
Enter a seed value: 171
597 10689 28587
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从程序的输出可以看出,每次程序使用不同的种子运行时,都会生成不同的随机数字流。然而,如果再次使用 19 或 171 作为种子运行程序,则将获得与第一次完全相同的数字。

程序的第 12 行中,使用 cin 从用户的输入获取随机数生成器种子的值。实际上,获取种子值的另一个常见做法是调用 time 函数,它是 C++ 标准库的一部分。

time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。请注意,在调用它时必须给它传递一个参数 0。同时程序中包含一个新的头文件 ctime,此头文件是使用 time 函数所必需的。
time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。请注意,在调用它时必须给它传递一个参数 0。同时程序中包含一个新的头文件 ctime,此头文件是使用 time 函数所必需的。

#include <iostream>
#include <cstdlib> // Header file needed to use srand and rand
#include <ctime> // Header file needed to use time
using namespace std;
int main()
{
    unsigned seed;  // Random generator seed
    // Use the time function to get a "seed” value for srand
    seed = time(0);
    srand(seed);
    // Now generate and print three random numbers
    cout << rand() << " " ;
    cout << rand() << " " ;
    cout << rand() << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.2 限制随机数的范围

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

number = rand() % max + 1;
  • 1

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

dice = rand() % 6 + 1;
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/463078
推荐阅读
相关标签
  

闽ICP备14008679号