C/C++产生随机数

(转载自beyond02\824)

C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。 (1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。 例如:     #include     #include     void main()     {            for(int i=0;i<10;i+)                  printf("%d/n",rand());     } (2)  如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:     例如:随机生成10个0~100的数:     #include     #include     #define random(x) (rand()%x)     void main()     {          for(int x=0;x<10;x++)                printf("%d/n",random(100));     }   (3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。 srand()函数定义 : void srand (unsigned int seed); 通常可以利用geypid()或time(0)的返回值来当做seed 如果你用time(0)的话,要加入头文件#include     例如:     #include     #include     #include     #define random(x) (rand()%x)     void main()     {          srand((int)time(0));          for(int x=0;x<10;x++)                printf("%d/n",random(100));     } 这样两次运行的结果就会不一样了!!   标准C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。 rand()函数没有输入参数,直接通过表达式rand()来引用;例如可以用下面的语句来打印两个随机数: printf("Random numbers are: %i %i/n",rand(),rand()); 因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随即并不是正真意义上的随机。 为了时程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。函数srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。 例程: 文件名: rand_srand.c /* This program generates and prints ten random integers between 1 and RAND_MAX*/ #include #includ int main() {         usigned int seed;        /*申明初始化器的种子,注意时usigned int 型的*/         int k;         pringt("Enter a positive integer seed value: /n");         scanf("%u",&seed);         srand(seed);         printf("Random Numbers are:/n");         for(k = 1; k <= 10; k++)         printf("%i",rand());         printf("/n");         return 0; } 你会发现,当你提供的种子相同时,随机数序列也时相同的。而且当种子为1时,与不使用srand()函数时一样的,也就是说rand()函数默认情况下初始化种子值为1; 在stdlib.h 中这两个函数的原型是: int rand(); void srand (unsigned int); 扩充:         x = rand()%11; /*产生1~10之间的随机整数*/         y = rand()%51 - 25; /*产生-25 ~ 25之间的随机整数*/         z = ((double)rand()/RAND_MAX)*(b-a) + a;/*产生区间[a,b]上的随机数*/     1-0:Microsoft VC++产生随机数的原理: Srand ( )和Rand( )函数。它本质上是利用线性同余法,y=ax+b(mod m)。其中a,b,m都是常数。因此rand的产生决定于x,x被称为Seed。Seed需要程序中设定,一般情况下取系统时间作为种子。它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。 1-1: 线性同余法: ?/P> 其中M是模数,A是乘数,C是增量,为初始值,当C=0时,称此算法为乘同余法;若C≠0,则称算法为混合同余法,当C取不为零的适当数值时,有一些优点,但优点并不突出,故常取C=0。模M大小是发生器周期长短的主要标志,常见有M为素数,取A为M的原根,则周期T=M-1。例如: a=1220703125         a=32719            (程序中用此组数)         a=16807           代码: void main( ) { const int n=100; double a=32719,m=1,f[n+1],g[n],seed; m=pow(2,31); cout<>seed; f[0]=seed;         for(int i=1;i<=n;i++)    //线性同余法生成随机数       {          f[i]=fmod((a*f[i-1]),(m-1));              g[i-1]=f[i]/(m-1);              cout.setf(ios::fixed);cout.precision(6); //设置输出精度          cout< 就是有名的混沌映射中的“人字映射”或称“帐篷映射”,它的非周期轨道点的分布密度函数:人字映射与线性同余法结合,可产生统计性质优良的均匀随机数。  for(int i=1;i<=n;i++)    //线性同余法生成随机数       {          f[i]=fmod((a*f[i-1]),m);              if(f[i]<=m/2)     //与人字映射结合生成随机数              {                     f[i]=2*f[i];              }              else              {                     f[i]=2*(m-f[i])+1;              } 1-3:平方取中法——冯·诺伊曼 1946年前后,由冯·诺伊曼提出,他的办法是去前面的随机数的平方,并抽取中部的数字。例如要生成10位数字,而且先前的值是5772156649,平方后得到33317792380594909201,所以下一个数是7923805949。 for(j=1;j<=n;j++)       {              i[j]=i[j-1]*i[j-1];           i[j]=i[j]/pow(10,5);         i[j]=fmod(i[j],pow(10,10));         g[j]=i[j]/pow(10,10);         cout.setf(ios::fixed);cout.precision(6); //设置输出精度         cout<

z=rand()%i c语言,C语言关于产生随机数文章转载两篇(一)相关推荐

  1. c语言如何初始化随机数种子,关于随机数函数rand和其种子初始化

    原文链接 随机数.随机数种子 在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器. 有关如何产生随机数的理论有 ...

  2. c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解

    在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...

  3. dlog()是什么意思 matlab语言,matlab语言.ppt

    <matlab语言.ppt>由会员分享,可在线阅读,更多相关<matlab语言.ppt(46页珍藏版)>请在人人文库网上搜索. 1.MATLAB语言,哈尔滨工程大学理学院,MA ...

  4. c语言 rand_C语言随机数

    1. 随机数概述 编写程序过程中,我们经常需要产生一些随机数.随机数在程序中分为两种: 1. 真随机数:完全没有规则,无法预测接下来要产生的数. 2. 伪随机数:通过一些预先设定好的规则产生不能简单预 ...

  5. 回旋矩形C语言,C语言回旋函数解释下,该如何处理

    当前位置:我的异常网» C语言 » C语言回旋函数解释下,该如何处理 C语言回旋函数解释下,该如何处理 www.myexceptions.net  网友分享于:2013-06-08  浏览:30次 C ...

  6. r语言dataellipse_R语言绘图:28个实用程序包

    原标题:R语言绘图:28个实用程序包 全文注释 # 示例参考帮助文档 # 我用Rstudio重现了所有示例 # 初识R语言,请戳我的原创推文""与"" # 使用 ...

  7. C语言函数大全--c开头的函数之复数篇

    C语言函数大全 c 开头的函数之复数篇 1. cabs,cabsf,cabsl 1.1 函数说明 1.2 演示示例 1.3 运行结果 2. creal,crealf,creall 2.1 函数说明 2 ...

  8. c 语言 pthread_create_【励达外语】第八篇 语言学习的5个关键期(上)

    本主题包含如下内容,因篇幅较长,分上下两篇介绍.# `$ f7 K: w  o/ \" G- X8 ^9 Q6 l  @# x/ i" \; Q4 m! |! i上篇:语言学习关键 ...

  9. 深入浅出C语言——C语言简介

    文章目录 编程语言: 一.C语言 二.C语言程序案例 三.数据类型 四.变量和常量 五.字符串 六.转义字符 七.注释 八.选择语句 九 .循环语句 十.函数 十一. 数组 十二.操作符 十三.常见关 ...

  10. 厦门理工计算机课设,厦门理工学院11级C语言C语言程序设计课程设计报告

    <厦门理工学院11级C语言C语言程序设计课程设计报告>由会员分享,可在线阅读,更多相关<厦门理工学院11级C语言C语言程序设计课程设计报告(25页珍藏版)>请在人人文库网上搜索 ...

最新文章

  1. 容器网络Calico进阶实践 | 褚向阳
  2. NeHe教程Qt实现——lesson14
  3. socket传输过程
  4. Win32 API CreateCompatibleDC 函数的相关应用
  5. (基础)HTML文档结构知识点讲解
  6. 对10个元素进行快速排序,在最好情况下,元素间的比较次数为( )次。
  7. JUnit 5符合AssertJ
  8. 线程和std::shared_ptr智能指针使用
  9. 启动Eclipse时发生An internal error occurred during: Initializing Java Tooling错误,详细提示如下:...
  10. eclipse java 注释_Eclipse Java注释模板设置详解
  11. 监控流媒体服务器连接监控摄像头的配置方式 - GB28181和ONVIF
  12. php 有request,请问,php中的$_REQUEST是什么意思啊?
  13. 47. 不用加减乘除做加法(C++版本)
  14. jQuery:节点操作、事件操作
  15. 物流仿真在AGV调度方面应用案例
  16. JAVA 日期格式化
  17. 【RF】射频集成电路与系统设计
  18. SOPCAST所有频道的地址
  19. javaweb项目中连接mysql导入驱动包
  20. 学习篇之数据分析库pandas

热门文章

  1. wait方法为什么要放在循环里
  2. MATLAB获取字符串中两个特定字符之间的内容
  3. ubuntu编译安装vim7.4
  4. js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
  5. centos locale报错问题
  6. Android PackageManager 详解
  7. 内存管理学习之内存寻址
  8. 从备用类型总盗用steal page
  9. kmeans算法中的sse_《Kmeans的K值确定》
  10. linux下代码覆盖率检查工具---gcov的用法