C++随机数的用法

news/2024/7/5 23:10:19 标签: c++, iostream, random, c, null, 语言
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">      学过别的高级语言的都知道࿰c;产生随机数用的都是类似于class="tags" href="/tags/RANDOM.html" title=random>random这样的字符࿰c;c++也不例外࿰c;在C++中使用的是rand()函数,但是不同的是࿰c;如果在C++中只使用了例如 "int i;i=rand();"这样࿰c;使用程序会发现每次得到的随机数都是一样的࿰c;据了解在C++中这样做是为了方便调试。如果要每次都长生不同的随机数࿰c;我们则需要在C++中加上"srand(time(NULL));"这条语句࿰c;他的作用是以时间为种子࿰c;产生随机数(我们都知道时间是在不断变化的࿰c;但两次获取随机数要在1秒后࿰c;否则数值还是一样)࿰c;下面看个例子。
    该例子是:在1~100内生成一个随机数࿰c;并指定一个数࿰c;显示出该数在产生多少个数后出现。程序代码如下:

ce="宋体">#include <class="tags" href="/tags/IOSTREAM.html" title=iostream>iostream>
#define fnum 56               //要找的数为56

using namespace std;
int main()
{
  int num=0,j,k=0;
  int get_rand(); 
   srand(time(0));
   for(j=1;num!=fnum;j++,k++)          

ce="宋体">  {
      num=get_rand();
    if(num<10)                 //右对齐
          cout<<" "<<num<<"  ";    
        else
          cout<<num<<"  ";
       
       
     if(j==15)                 //每行15个数
        {
          putchar('n');
          j=0;
        }
   }
    cout<<'n'<<"数字"<<fnum<<"已经找到࿰c;共生成了"<<k<<"个随机数。"<<endl;

ce="宋体">return 0;
}

ce="宋体">int get_rand()
{
  int i;
  i=rand()%100+1;
  return i;   
}

ce="宋体">///

        所谓的“伪随机数”指的并不是假的随机数࿰c;这里的“伪”是有规律的意思。其实绝对的随机数只是一种理想状态的随机数࿰c;计算机只能生成相对的随机数即伪随机 数。计算机生成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律࿰c;一部份则不遵守任何规律。比如“世上没有两片形状完全相同的树叶”࿰c;这正点到了事物的特性 —— 规律性;但是每种树的叶子都有近似的形状࿰c;这正是事物的共性 —— 规律性。从这个角度讲࿰c;我们就可以接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。

        C++中的标准库<cstdlib>(包含在<class="tags" href="/tags/IOSTREAM.html" title=iostream>iostream>中)提供两个帮助生成伪随机数的函数:rand()和srand()。
函数一:int rand(void);
从srand(seed)中指定seed开始࿰c;返回一个范围介于[seed࿰c;RAND_MAX(0x7fff))的随机整数
函数二:void srand(unsigned seed);
参数seed是rand()的随机种子࿰c;即用来初始化rand()的起始值。

    系统在调用rand()之前都会自动调用srand()࿰c;如果用户在rand()之前曾调用过srand()给参数seed指定了一个值࿰c;那么rand ()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand()࿰c;那么rand()就会自动调用srand (1)࿰c;即系统默认将1作为伪随机数的初始值。

    由上述可得知࿰c;如果希望rand()在每次程序运行时产生的值都不一样࿰c;必须给srand(seed)中的参数seed指定一个变值࿰c;这个变值必须在每次 程序运行时都不一样(比如到目前为止流逝的时间);如果我们给seed指定的是一个定值࿰c;那么每次程序运行的时候࿰c;rand()产生的随机数都会一样࿰c;只 不过这个值是[seed࿰c;RAND_MAX(0x7fff))范围中的一个随机取得的值。

    举几个例子说明一下࿰c;假设我们要取得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࿰c;跟程序一的结果完全一样。

程序三(指定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࿰c;虽然值跟程序二不一样࿰c;不过每次运行时的结果也都相同。

程序四(指定seed的值为当前系统流逝了的时间࿰c;单位为秒(time_t time(0))):
#include<ctime>
……
srand((unsigned)time(0));
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<<ran_num<<“ ”;
}
    运行程序四的时候࿰c;第一次输出:0 1 5 4 5 0 2 3 4 2࿰c;第二次输出:3 2 3 0 3 5 5 2 2 3࿰c;... ...每次的运行结果都不一样࿰c;因为每次启动程序时的时刻都不同。

关于time_t time(0)
    time_t 被定义为长整型࿰c;它将返回从1970年1月1日零时零分零秒到现在所经历过的时间࿰c;单位为秒。比如输出 cout<<time(0) ࿰c;将得到值约为1169174701࿰c;约等于37(年)* 365(天)* 24(小时)* 3600(秒)(月和日不计)。

关于ran_num=rand()%6
    将rand()的返回值与6求模是必须的࿰c;这样才能确保目的随机数落在[0࿰c;6)之间࿰c;否则很可能会得到一个非常巨大的数值 (RAND_MAX一般为32767)。一个通用的公式是:要想取得[a࿰c;b)之间的随机整数࿰c;使用(rand()%(b-a))+ a࿰c;结果包含 a 而不含 b 。

cle>

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

相关文章

​2023年湖北黄冈安管三类人员个人可以报名吗 ?报名时间是什么时候?

2023年湖北黄冈安管三类人员个人可以报名吗 &#xff1f;报名时间是什么时候&#xff1f; 个人不可以报名。安管三类人员包括建筑施工企业主要负责人、建筑施工企业项目负责人以及建筑施工企业专职安全生产管理人员&#xff0c;他们是对本企业安全生产工作负责的三类人员&#…

PostgreSQL 修改设置数据库的默认用户以及权限.

1. 登录PG数据库. psql -U postgres 界面效果为: [rootcentos76 ~]# psql -U postgres psql (10.7) Type "help" for help.postgres# 其实这里面有一个主意事项. psql 的 命令执行 其实是在环境变量里面的 我这边使用的是rpm 方式安装的pg 数据库. 2. 简单说一下pg…

(转载)C/C++排序算法

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大&#xff0c;所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度&#xff0c;一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍&…

ESXi 虚拟机 提示 无法打开本地虚拟机的 xxx.vmx 的本地管道的 问题解决.

1. 今天同事与我联系, 说一个虚拟机出现连不上, vcenter控制台关闭虚拟机之后 再次打开报错: 2. 自己最开始的解决方法 移除虚拟机, 进入服务器的datastore 重新注册, 结果发现问题更加严重, 虚拟机直接无法使用了. 3. 问题解决的方法与思路来源. 3.0 重新注册之后 有这么个提示…

统计学习方法概论

统计学习的 特点是&#xff1a;关于计算机基于数据构建概率统计模型并运用模型对数据进行预测和分析的一门学科 对象是&#xff1a;数据 目的是&#xff1a;进行预测与分析 目标是&#xff1a;从假设空间中选取最优模型 方法是&#xff1a;监督学习&#xff08;重点&#xff09…

11-5 一点记录

转载于:https://www.cnblogs.com/ganmk--jy/p/6032787.html

memcpy函数, strcpy(), memmove().

原型&#xff1a;extern void *memcpy(void *dest, void *src, unsigned int count);头文件&#xff1a;#include <string.h>功能&#xff1a;由src所指内存区域复制count个字节到dest所指内存区域。说明&#xff1a;src和dest所指内存区域不能重叠&#xff0c;函数返回指…

软件加密锁编程技巧

本文将介绍软件加密锁的一些编程技巧&#xff0c;以及软件开发者将如何编写安全可靠的代码&#xff0c;如何对付各种各样的加密狗破解&#xff0c;编写加密程序时应该尽量避免的一些问题等等。以下是全文。 一、加密狗加密的基本原理 开发商程序通过调用硬件加密狗的接口模块对…