Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++随机数(rand和srand)函数用法详解

C++随机数(rand和srand)函数用法详解

作者头像
C语言与CPP编程
发布于 2020-12-02 03:32:51
发布于 2020-12-02 03:32:51
4.9K05
代码可运行
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程
运行总次数:5
代码可运行

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

随机数字常用于许多不同类型的程序中,以下是一些示例:

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

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

randomNum = rand();

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//This program demonstrates what happens in C++ if you
// try to generate random numbers without setting a "seed".
#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次运行输出结果: 41 18467 : 6334 第2次运行输出结果: 41 18467 6334

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// This program demonstrates using random numbers when a
// "seed" is provided for the random number generator.
#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次运行结果: Enter a seed value: 19 100 15331 - 209 第2次运行结果: Enter a seed value: 171 597 10689 28587

程序中,第 9 行中创建的用于保存种子的变量 seed 被声明为 unsigned 无符号类型。这个数据类型只保存非负整数。这是 srand 函数在调用时期望接收的数据类型,因此使用 unsigned 变量类型可以保证不会将负数发送给 srand。从程序的输出可以看出,每次程序使用不同的种子运行时,都会生成不同的随机数字流。然而,如果再次使用 19 或 171 作为种子运行程序,则将获得与第一次完全相同的数字。 程序的第 12 行中,使用 cin 从用户的输入获取随机数生成器种子的值。实际上,获取种子值的另一个常见做法是调用 time 函数,它是 C++ 标准库的一部分。 time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。请注意,在调用它时必须给它传递一个参数 0。同时程序中包含一个新的头文件 ctime,此头文件是使用 time 函数所必需的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//This program demonstrates using the C++ time function
//to provide a nseed,T for the random number generator.
#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;
}

程序输出结果:

2961 21716 181

限制随机数的范围

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

number = rand() % max + 1;

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

dice = 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 的随机数。

实例:

方法1

 使用 rand 函数可以获取,如下。

随机数大小是在0到RAND_MAX,值为2147483647,它是在stdlib中定义的,如果我们希望在某个范围内,可以使用 % 结合 / 来实现

  但是不难发现,这里获得的随机数是唯一确定的,而不是变化的。所以,如果我们希望获得变化的随机数,可以使用下面的方法。

方法二:

  既然使用rand函数无法获取到变化的随机数,这里就可以使用srand来实现了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
for (int i = 0; i < 1000; i++)
cout << rand() << endl;
return 0;
}

这里,我们需要引入ctime库,其中time(0)是获取从1970年开始的时间(单位:s),然后再获取rand(),这时的rand就是随机变化得了。如下:

但这里获取的值是不确定的,而如果我们希望获得在某一范围内的值呢,也很简单,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
for (int i = 0; i < 100; i++)
cout << rand() % 100 << endl;
return 0;
}

如上,使用求余数的方法,我们可以获得0 - 100之间的值。

而如果我们希望得到0 - 1之间的数呢?如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
for (int i = 0; i < 100; i++)
cout << (rand() % 10) * 0.1 << endl;
return 0;
}

而我们希望得到-1 到 1 之间的数呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
for (int i = 0; i < 100; i++)
if (i % 2 == 0)
cout << (rand() % 10) * 0.1 << endl;
else
cout << (rand() % 10) * -0.1 << endl;
return 0;
}

上面的程序虽然可以得到正随机数和负随机数,但是是交替出现的,还是不够随机,所以我们可以采用下面的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
double a;
for (int i = 0; i < 100; i++)
if (rand() % 10 > 0.4)
    {
cout << (rand() % 10) * 0.1 << endl;
    }
else
    {
        a = (rand() % 10) * -0.1;
if (a == -0.0)
        {
cout << 0 << endl;
        }
else
        {
cout << a << endl;
        }
    }
return 0;
}

这样,我们就可以得到真正的随机数了,后面使用 a == -0.0 判断是为了防止输出 -0 的情况。最终结果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言与CPP编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C/C++中随机函数rand()和srand()的用法「建议收藏」
rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。
全栈程序员站长
2022/08/11
2.2K0
c/c++产生随机数
在算法竞赛中,常常需要用生成随机数的办法来产生测试数据,调试程序。用到的函数有rand(),srand(),time()。
刘开心_1266679
2019/02/14
7140
输出1-100之间的随机数,控制输出格式,每行10个(注释有详解)
码事漫谈
2024/12/20
1020
输出1-100之间的随机数,控制输出格式,每行10个(注释有详解)
C++——随机数算法
在这里,我们要明确,计算机随机化出来的数字都是伪随机数字,就是近似于随机数,简单来说这个伪随机数需要依靠一个种子来决定这个数值的大小。默认情况下,这个种子的值是1。这造成了如果不改变种子的值,我们生成的随机数就会是同一个值。所以,我们就要设置种子
全栈程序员站长
2022/09/14
7910
C++——随机数算法
扩展随机数
随机数生成 (1)可使用random等系统函数,构造函rand 15 :在[1,5]范围,均匀分布随机函数  (2)不可使用random,仅仅基于rand15构造rand112:在[1,12]范围,均匀分贝的随机函数 (3)函数randint26:在【2,3,4,5范围内等概率生成某个整数的随机函数。 (4)不可以使用random,仅给予randint26 构造randint212:在[2,...11,12]范围内等概率生成某个整数的随机函数。 对于某个固定范围的随机函数比如 rand15 如果扩展1-12
ShenduCC
2018/04/27
1K0
【C语言指南】随机数的实现——rand函数、srand函数和time函数
CPlusPlus中关于该函数的介绍 → rand - C++ 参考 (cplusplus.com)
倔强的石头
2024/12/06
1.6K0
【C语言指南】随机数的实现——rand函数、srand函数和time函数
rand(),srand()产生随机数
      rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a).       初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过
猿人谷
2018/01/17
3K0
c++那些事儿11.0 STL--List
首先对STL不熟悉的同学,可以先看看这篇文章里有些东西: ---- STL中容器相关知识点 知识点综述: ---- List:序列式容器,双向链表,在内存中不连续存放。 优点: 插入,删除元素效率高
热心的社会主义接班人
2018/04/27
5760
c++那些事儿11.0 STL--List
随机数
在 C++ 标准库中,std::rand() 和 std::srand() 是较早的随机数生成方法,适用于简单的需求。需要注意的是,它们的随机数质量不高,且每次运行程序时,如果没有设置种子,生成的随机数序列是固定的。
ljw695
2024/11/21
1700
随机数
【编程经验】C语言中如何使用随机数?
C语言中如何使用随机数 随机数的使用,是不少在学C语言过程中进行一些小功能开发的同学的一个技术问题,今天我们就为大家讲解如何在C语言中使用随机数。 通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪随机数并非是假的! 只不过是计算机按自己的一套理论生成,并不是”完全理想”状态下的随机数,所以是可以接受的。 函数原型为:int rand(void); 需要包含stdlib头文件,它可以生成一个0 ~RAND_
编程范 源代码公司
2018/04/18
2.8K0
【编程经验】C语言中如何使用随机数?
C++ 随机数
    头文件<random>,使用的随机数引擎类是std::default_random_engine,可通过()调用运算符返回随机数,简单的例子:
学徒漠筱歌
2022/07/17
6070
实验2 C++数组与指针
一.实验目的: 掌握一维数组和二维数组的定义、赋值和输入输出的方法。 掌握字符数组和字符串函数的使用。 通过实验进一步掌握指针的概念,会定义和使用指针变量。 能正确使用数组的指针和指向数组的指针变量。 能正确使用字符串的指针和指向字符串的指针变量。 能正确使用引用型变量。 二.实验内容: 运行调试第5章编程示例5-3,5-4,5-5扑克发牌程序;完成练习题5.3.1,5.4.1, 5.5.1和7.5.2; 运行调试第6章编程示例6-3数组排序器;完成以下练习: (1) 改进sort函数;
步行者08
2018/10/09
4440
Boost C++ 库 | 多线程
Qt历险记
2024/10/24
2680
Boost C++ 库 | 多线程
【C++简明教程】随机数生成
【C++ 简明教程】每次更新将会以代码块的形式发布,可以作为手册或者模块以供查询。
机器视觉CV
2020/07/23
8.1K0
C++ 随机数
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
AIHGF
2019/02/18
8320
C++ 数学运算, <cmath>
在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C++ 库中,叫做内置函数。您可以在程序中引用这些函数。
zhangjiqun
2024/12/16
1120
关于如何用rand(),srand()和time()函数创建简单的随机数
需要rand()函数来创建,这个函数可以返回整形随机数,但是需要一个种子,如果没有就是rand()括号里的内容。但是和创建主函数如果不填参数main()一样,rand()里如果不填默认是填1,也就是种子1。每一个种子都可以返回特定且唯一的随机数。如:
用户11290664
2024/09/25
1620
关于如何用rand(),srand()和time()函数创建简单的随机数
【编程概念】--随机数
在编程的过程中经常遇到需要生成随机数的问题,其实这个就是引用系统自带的随机数函数产生数值来使用。 C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。 (1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。 例如: #include<stdio.h> #
程序员互动联盟
2018/03/16
1K0
C++随机数用法大全
程序中经常会需要用到随机数,所谓随机数,就是随机生成一个数字供程序使用。大部分语言都有随机数生成器的函数,比如C/C++就有个最简单随机函数:rand,它可以生成一个“伪随机”的均匀分布的整数,范围在0到系统相关的一个最大值之间。
Cloudox
2021/11/23
6910
C语言学习系列-->【关于随机数的实现】
程序在先使用rand函数前,先使用一个srand函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
南桥
2024/01/26
1690
C语言学习系列-->【关于随机数的实现】
相关推荐
C/C++中随机函数rand()和srand()的用法「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验