c语言中srand的作用,C++随机数(rand和srand)函数用法详解

news/2024/7/5 12:47:26 标签: c语言中srand的作用

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

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

计算机游戏通常要使用随机数字来模拟一些随机过程,例如掷骰子或发牌。

模拟程序使用随机数字来决定后续将要发生的一系列操作或人与动物等的行为。可以创建使用随机数字的公式以确定特定事件在程序中出现的时间。

数据分析程序可能会使用随机数字随机选择要检验的数据。

计算机安全系统使用随机数字来加密敏感数据。

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

randomNum = rand();

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

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

//This program demonstrates what happens in C++ if you

// try to generate random numbers without setting a "seed".

#include

#include // 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 在整个程序中仅被调用一次。

// This program demonstrates using random numbers when a

// "seed" is provided for the random number generator.

#include

#include // 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 函数所必需的。

//This program demonstrates using the C++ time function

//to provide a nseed,T for the random number generator.

#include

#include // Header file needed to use srand and rand

#include // 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 的随机数。


http://www.niftyadmin.cn/n/1214772.html

相关文章

常用的shell脚本

1.启动脚本 start.sh #!/bin/bash nohup java -Xmx512m -Xms128m -jar /home/apps/SzjjServices/SzjjServices-1.0.0.jar >/dev/null 2>&1 &2.关闭脚本 stop.sh #!/bin/bash pidps -ef | grep "Szjj" | grep -v grep | awk {print $2} if [ -n "…

C语言 参数检查,C语言isatty()函数:检查给定的设备类型

函数名&#xff1a;isatty头文件&#xff1a;函数原型&#xff1a; int isatty(int handle);功能&#xff1a; 检查给定的设备类型参数&#xff1a;int handle 为要检查的设备文件句柄返回值&#xff1a; 普通文件 返回0 &#xff0c;设备 返回-1补充&#xff1a;常用设备名…

为什么苹果6没有录屏_为什么安卓的消息推送没有苹果好用?

最近有小朋友问我&#xff1a;“缺姐姐&#xff0c;缺姐姐&#xff0c;为什么我从苹果手机换成安卓手机后收到消息经常延迟&#xff0c;甚至收不到呢&#xff1f;太误事了。”其实这是ios系统和Android系统推送机制不同导致的&#xff0c;那我就简单讲讲二者的不同吧。iOS的推送…

Next.js 7发布,构建速度提升40%

Next.js团队发布了其开源React框架的7版本。该版本的Next.js主要是改善整体的开发体验&#xff0c;包括启动速度提升57%、开发时的构建速度提升40%、改进错误报告和WebAssembly支持。\\Next.js是一个React框架&#xff0c;它的主要目标是在生产环境中提供出色的性能和良好的开发…

c语言收集域名信息,使用C语言获取指定域名的IP

最近正在学习使用C语言发送电子邮件&#xff0c;但是发送邮件需要连接到SMTP服务器&#xff0c;C语言只支持连接IP&#xff0c;而不支持连接域名&#xff0c;那么就需要将SMTP地址转换成IP地址了。虽然我们可以使用DOS命令中的ping命令来将SMTP服务器的IP地址转换出来&#xff…

iphone屏蔽系统更新_iOS 12系统频繁提示更新,教你一招屏蔽更新!

「 改变能改变的一切&#xff0c;接受不能改变的一切&#xff01; 」▼iOS 系统老是频繁推送小更新&#xff0c;极不友好地打扰自己的用户&#xff0c;刚纠结更新完上一个版本&#xff0c;新版本又来了&#xff01;尤其是旧版本用着流畅稳定&#xff0c;新版本还会搞出新问题。…

WPF 关于圆角的制作

原文:WPF 关于圆角的制作1、使用Boder(一般情况): 设置CornerRadius属性 <Border x:Name"border" CornerRadius"20"> ... </Border> 2、创建ClippingBorder类&#xff1a; View Code using System; using System.Collections.Generic; using …

举例说明层次分析的三大原则_LabVIEW面向对象编程_初窥门槛(2)_设计原则(SOLID)...

该系列一共是9篇文章&#xff0c;本文是该系列的第二篇&#xff0c;是讲述通用的面向对象编程设计原则&#xff08;SOLID&#xff09;&#xff0c;LabVIEW作为一门具备面向对象编程范式的图形化编程语言当然也要遵循上述的通用设计原则&#xff0c;当然除了接口隔离原则无法直接…