产生随机数

C++随机数生成 文章目录一、伪随机数生成1. rand()2. srand()3. 测试代码二、C++11随机数生成1. 随机数生成算法2. 随机数分布类型3. random_device 一、伪随机数生成 1. rand()  rand()会返回一个随机数值,范围是在0至RAND_MAX间。RAND_MAX定义在stdlib.h头文件中,其值为2147483647。 2. srand()  srand()可以用来设置rand()产生随机数时的随机数种子。通过设置不同的种子,可以获取不同的随机数序列。例如,可以利用sran 阅读详情

一、随机数的生成

#include<stdlib.h>

#include <stdio.h>

#include <time.h>

void test_rand()

{

    unsigned long n;

    int k;

    //srand((unsigned)time(NULL));

   

    for( k = 0;k < 10;k++)

 

    {

 

         n = rand();

 

         printf("%10d/n", n);

 

    }

 

}

 

 

main()

{

    int i,j,num_rand;

    int m,w;

    double num_randf,num_randt;

    for(i=0;i<10;i++)

    {

         //j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); //这个精度更高

         srand(1);

         //j=1+10*rand()/(RAND_MAX+1);

         j=rand();

         printf("%d /n",j);

        

    }

    for (i=0;i<6;i++)

    {

         num_rand=rand()%6;//是整除

         printf("%d/n",num_rand);

    }

    for ( m=0;m<6;m++)

    {

         num_randf=rand()/(double)(RAND_MAX);//是除以,不是求模

         printf("%f/n",num_randf);

    }

    for (w=0;w<6;w++)

    {

         //srand((unsigned)time(NULL));

         num_randt=1.0+rand()/(double)(RAND_MAX/10);

         printf("%f/n",num_randt);

    }

    test_rand();

}

没有srand()函数,只有rand()函数,则每次运行程序生成的随机数都是一样的,有了srand()函数,则每次生成的都不一样。

C++中取随机数直接用函数rand()就可以了。例如:int i=rand();就会返回一个随机数。但返回的随机数也有它自身的特点。下面是转载网文。说的比较详细。

 

标准库〈cstdlib〉(被包含于〈iostream〉中)提供两个帮助生成伪随机数的函数:

 

函数一:int rand(void);

从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。

 

函数二:void srand(unsigned seed);

参数seed是rand()的种子,用来初始化rand()的起始值。

 

可以认为rand()在每次被调用的时候,它会查看:

1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用

srand(seed)一次来初始化它的起始值。

2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

 

根据上面的第一点我们可以得出:

1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。

2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。

3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

 

举几个例子,假设我们要取得0~6之间的随机整数(不含6本身):

 

例一,不指定seed:

for(int i=0;i〈10;i++){ 

ran_num=rand() % 6;

cout〈〈ran_num〈〈" ";

}

每次运行都将输出:5 5 4 4 5 4 0 0 4 2

 

例二,指定seed为定值1:

srand(1);

for(int i=0;i〈10;i++){ 

ran_num=rand() % 6;

cout〈〈ran_num〈〈" ";

}

每次运行都将输出:5 5 4 4 5 4 0 0 4 2

跟例子一的结果完全一样。

 

例三,指定seed为定值6:

srand(6);

for(int i=0;i〈10;i++){ 

ran_num=rand() % 6;

cout〈〈ran_num〈〈" ";

}

每次运行都将输出:4 1 5 1 4 3 4 4 2 2

随机值也是在[0,6)之间,随得的值跟srand(1)不同,但是每次运行的结果都相同。

 

例四,指定seed为当前系统流逝了的时间(单位为秒):time_t time(0):

#include 〈ctime〉

//…

srand((unsigned)time(0));

for(int i=0;i〈10;i++){ 

ran_num=rand() % 6;

cout〈〈ran_num〈〈" ";

}

第一次运行时输出:0 1 5 4 5 0 2 3 4 2

第二次:3 2 3 0 3 5 5 2 2 3

总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1秒?见下)。

 

关于time_t time(0):

 

time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。比如假设输出:

cout〈〈time(0);

值约为1169174701,约等于37(年)乘365(天)乘24(小时)乘3600(秒)(月日没算)。

 

另外,关于ran_num = rand() % 6,

 

将rand()的返回值与6求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则rand()的返回值本身可能是很巨大的。

一个通用的公式是:

要取得[a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a不含b)。

在a为0的情况下,简写为rand() % b。

 

最后,关于伪随机浮点数:

 

用rand() / double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:

double ran_numf=0.0;

srand((unsigned)time(0));

for(int i=0;i〈10;i++){ 

ran_numf = rand() / (double)(RAND_MAX);

cout〈〈ran_numf〈〈" ";

}

运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。

 

如果想取更大范围的随机浮点数,比如1~10,可以将

rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)

运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。

至于100,1000的情况,如此类推。

 

以上不是伪随机浮点数最好的实现方法,不过可以将就着用用…

 

C++ 中的随机数生成全方面介绍 随机数是指在一个特定范围内,按照某种概率分布生成的数。在计算机中,真正的随机数很难生成,通常使用伪随机数生成器(Pseudo-Random Number Generator, PRNG)来近似实现。C++ 提供了多种生成随机数的方法,从简单的rand()和srand()到强大的库。选择合适的方法和工具,可以让你的程序更加灵活和高效。希望本文对您理解 C++ 中的随机数生成有所帮助。 阅读详情

相关推荐

C++产生随机数一直重复的问题

C++产生随机数,我们都知道,无非就是利用srand产生一个种子,然后利用rand函数产生随机数即可。但是今天在产生随机数的时候遇到了一个怪事,就是不管自己怎么产搞,多次产生的随机数都是重复的。自己的代码简化为下: #include "stdafx.h" #include <cstdlib> #include <ctime> #include <iostream&...

MeteorChenBo的博客 1万+

c++随机数

计算机的运行是通过代码来进行的,而代码的执行需要确定的数字,即计算机的运行过程是一个确定的过程,计算机的运行过程是一个确定的过程,所以不可能产生一个真正有意义的数字,即计算机只能产生伪随机数。 引用随机数需要引用头文件 #include <cstdlib> 1.随机数函数 (1) c++提供产生随机数的函数: rand(),原型为:int rand(void); rand() 产生一个 [0…RAND_MAX] 之间的数字,RAND_MAX是可以产生的最大随机数(2^31-1),是一个常量

mantou_riji的博客 3万+

MATLAB产生随机数

(1)用计算机产生的是“伪随机数”。用投色子计数的方法产生真正的随机数 , 但电脑若也这样做 , 将会占用大量内存 ; 用噪声发生器或放射性物质也可产生真正的随机数 , 但不可重复 . 而用数学方法产生最适合计算机 , 这就是周期有限 , 易重复的 ” 伪随机数 ”matlab里和随机数有关的函数:betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd

ZSZ_shsf的博客 2583

C/C++ 生成随机数

本文摘要: 文章介绍了C++中生成随机数的多种方法。1)使用rand()函数生成0-RAND_MAX范围的随机数,但需配合srand(time(NULL))实现真正随机;2)推荐使用C++11的<random>库,包含default_random_engine(基础随机引擎)、uniform_int_distribution(整数范围分布)、uniform_real_distribution(实数范围分布)和bernoulli_distribution(布尔值分布)等类;3)详细说明了mt199

人无远虑,必有近忧 4万+

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 520

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI)

计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的

weixin_45719141的博客 1万+

【C++】C++生成随机数

计算机所产生的随机数其实并不是真正随机的,而是伪随机的。当我们在使用rand()生成随机数时得到的实际上是从由随机数种子生成的一个数字序列中生成的一个数,该数字序列的长度一般是65535。也就是说一个固定的随机数种子生成的数字序列长度一般是65535,当我们在这个数字序列中生成随机数时,如果已经得到了65535个随机数那么接下来生成的随机数会和之前的随机数重复。

unoreason的博客 2万+

告别龟速下载!保姆级教程:用离线包5分钟搞定Arduino IDE的STM32开发环境(附最新库文件)

本文提供了一套完整的Arduino IDE离线配置方案,帮助开发者5分钟快速搭建STM32开发环境。通过详细的板支持包安装指南、文件校验方法和常见问题解决方案,彻底解决GitHub下载慢的问题,提升开发效率。

weixin_26802933的博客 363

C++产生随机数

随机数 计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个...

雪雪 3万+

使用 Restart Extension 继续解决 Ansys 机械分析

您正在执行复杂或大型的多步有限元分析,突然,您意识到经过数小时的求解后,您需要添加或修改边界条件。在本篇博文中,您将了解如何利用 Ansys Mechanical 中的 RestartAnalysis 扩展来扩展多步分析,方法是合并额外的时间步骤和边界条件,而不会丢失已计算的结果。幸运的是,在 Mechanical 中,有一种直接的方法可以实现这一点,而不会损害您之前的结果,而这在添加新边界条件和使用重新启动点时经常发生。得到的结果符合预期,您可以看到施加的力产生的这两个部分之间的相对位移。

jkh920184196的博客 1232

RK3588设备树节点实战:从零配置音频与显示模块(ES8388+DSI0)

本文详细介绍了在RK3588平台上配置音频编解码器ES8388和显示接口DSI0的设备树节点实战。通过具体案例拆解设备树节点的编写逻辑与调试技巧,包括音频路由与声卡配置、DSI控制器基础配置、视频通路路由配置以及电源管理与时钟树设计。文章还提供了调试工具与实战技巧,帮助开发者快速解决常见问题。

weixin_42525637的博客 351

产生随机数的方法

产生随机数的方法 package day02; /** * 如何獲取隨機數 * @author Amanda * java中有龐大的類庫,其中有個數學類,Math類,位於java.lang包;這是Java核心包; * 規定:使用核心包的類,不需要導包 String也是核心包的類 * * Math類有random()方法 * 使用該方法可以得到一個double類型的 ...

Amanda的博客 752

win11一直弹出用户账户控制怎么解决

用户帐户控制简称UAC,是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。近期有部分Win11用户想要关闭UAC,但是不知道应该如何操作,对此下面我就教给大家操作方法,大家可以去尝试看看。...

xitongzhijia_abc的博客 5万+

Python中产生随机数

Python产生随机数: 一.Python自带的random库 1.参生n--m范围内的一个随机数: random.randint(n,m) 2.产生0到1之间的浮点数: random.random() 3.产生n---m之间的浮点数: random.uniform(1.1,5.4) 4.产生从n---m间隔为k的整数: ...

zq476668643的博客 26万+

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

车载以太网网络测试-24【SOME/IP概述】

SOME/IP**(Scalable Service-Oriented Middleware over IP)是一种基于IP网络的面向服务的通信协议,专为汽车电子系统设计,支持服务发现、远程过程调用(RPC)和事件通知等功能。核心标准是由 AUTOSAR(汽车开放系统架构)定义,现已成为车载通信的重要标准之一(如AUTOSAR 4.0+)。SOME/IP的全称是,它是一种基于IP网络的面向服务的通信协议,广泛应用于汽车电子(AUTOSAR)和物联网领域。Scalable(可扩展的)含义。

车载网络测试工程师的博客 2192

计算机随机数的产生

计算机中随机数的产生大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。伪随机数并不是假随机数,这里的“

6077

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

如何产生随机数

C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。 rand() 单纯的rand()会返回一个0至RAND_MAX之间的随机数值,而RAND_MAX的值与int位数有关,最小是32767。不过rand()是一次性的,因为系统默认的随机数种子为1,只要随机数种子不变,其生成的随机数序列就不会改变。 其实,对于rand()的范围,我们是可以进

Changqing9的博客 624

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言产生随机数的方法

原理概述 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原型是: void sra...

xiezhg5的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c++产生均匀分布随机数赋值_如何产生任意分布的随机数

有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数。由于电脑只能储存有限精度的数字,它产生的随机数必然出现循环周期,自然是伪随机数了。而电脑生成的伪随机数就不一样了,它可以高效地生(伪)产(造)随机数,而且可以被再利用。生产伪随机数的原理是非常非常简单的:第一步:假设我们手头已经有一串数字,我们称它们为种子。对这些种子用递归法,“随机地(其实并不是)”生成...

weixin_39718890的博客 630

新的C++随机数产生方法

新的C++,指的是C++11标准才能够支持的随机数产生方法。不过考虑到现在C++20都已经很常见了,这应该也没问题。随机数产生需要一个随机数发生器,以及一个随机数分布。

WhoisPo的专栏 1234

C++产生各种随机数

      c++产生随机数 本博客主要内容包括: 1. rand()函数; 2.std库的default_random_eigine类; 3.OpenCV库。   1. rand()函数产生float随机数 #include <stdlib.h> srand((unsigned int)time(0));//随机种子,不要写在循环体中 int a = rand() % 1...

踏雪飞鸿的博客 1413

芯片验证中产生随机数的几种用法

产生的随机数,即使每次使用相同的seed,jump_idx会一样.产生的随机数,即使每次使用相同的seed,data也会不一样.(2) 采用std产生随机数。(1) 直接产生随机数。

fengtianfu138的博客 224

JAVA产生指定范围的随机数

  《JAVA产生指定范围的随机数》  产生机制:                      产生Min-Max之间的数字  实现原理:                     Math.round(Math.random()*(Max-Min)+Min) long Temp; //不能设定为int,必须设定为long //产生1000到9999的随机数 Temp=Math.round(Math.

雄鹰国际 5598

c语言产生随机数的函数

1.产生随机数  (1)使用该函数首先应在开头包含头文件stdlib.h(2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。(3)rand()函数没有输入参数,直接通过表达式rand()来引用;(4)标准C并没有规定int整数的位数,int的位数由编译器定义,例如:       TC编译器中in...

MADE_哒哒 4万+

oracle随机数的产生

oracle专门提供一个包DBMS_RANDOM,用于产生随机数。该包中包含一些过程或者函数,调用这些函数能够产生各种各样的随机数。 1、返回一个[0,1)的随机数 SQL> select dbms_random.value from dual; 2、返回一个大于或等于1且小于50的随机数 SQL> select dbms.random.value(1,50) from dual; ...

huangbaokang的博客 6942
上一篇: const用法详解
下一篇: 主函数main中变量(int argc,char *argv[])的含义
learngis
博客等级 码龄18年 73粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值