zoukankan      html  css  js  c++  java
  • rand()函数

     1 //输出了32767
     2 //RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:
     3 //#define RAND_MAX 0x7FFF 
     4 #include <iostream>
     5 #include <stdlib.h>
     6 using namespace std;
     7 int main()
     8 {
     9      cout<<RAND_MAX<<endl;
    10      while(1);
    11 }

      因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。

    返回值:

    返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。

    0~RAND_MAX每个数字被选中的机率是相同的。

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

    初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,

    那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的,对了,你知道time() 函数的功能是返回从1970/01/01到现在的秒数的吧,可能这个起始时间不正确,你查一下对不对吧,C还提供了另一个更方便的函数,randomize()

    原形是void randomize(),功能是用来始初rand() 的种子的初始值,而且该值是不确定的,它相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h罢了

     time_t t;

    srand((unsigned) time(&t));

    用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))产生一个0到n之间的随机数(不包括两头)。

     1 //产生1到10的数 
     2 #include <iostream>
     3 #include <stdlib.h>
     4 using namespace std;
     5 int main()
     6 {
     7      int i,j;
     8      for(i=1;i<=100;i++)
     9      {
    10           j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
    11           cout<<j<<" "<<endl;
    12      }
    13      while(1);
    14      return 0;
    15 }
    系统里的随机数是利用初等数论中的同余定理来实现的.   
    产生整数rand的原理是:
    y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
    a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,
    他被称为seed。
    每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,
    虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。
    为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t


    比如VC中对于rand()函数是如下实现的.
    int __cdecl rand (void)
    {
    return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
    }

     

  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2756084.html
Copyright © 2011-2022 走看看