z=rand()%i c语言,C语言关于产生随机数文章转载两篇(一)
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语言关于产生随机数文章转载两篇(一)相关推荐
- c语言如何初始化随机数种子,关于随机数函数rand和其种子初始化
原文链接 随机数.随机数种子 在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器. 有关如何产生随机数的理论有 ...
- c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解
在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...
- dlog()是什么意思 matlab语言,matlab语言.ppt
<matlab语言.ppt>由会员分享,可在线阅读,更多相关<matlab语言.ppt(46页珍藏版)>请在人人文库网上搜索. 1.MATLAB语言,哈尔滨工程大学理学院,MA ...
- c语言 rand_C语言随机数
1. 随机数概述 编写程序过程中,我们经常需要产生一些随机数.随机数在程序中分为两种: 1. 真随机数:完全没有规则,无法预测接下来要产生的数. 2. 伪随机数:通过一些预先设定好的规则产生不能简单预 ...
- 回旋矩形C语言,C语言回旋函数解释下,该如何处理
当前位置:我的异常网» C语言 » C语言回旋函数解释下,该如何处理 C语言回旋函数解释下,该如何处理 www.myexceptions.net 网友分享于:2013-06-08 浏览:30次 C ...
- r语言dataellipse_R语言绘图:28个实用程序包
原标题:R语言绘图:28个实用程序包 全文注释 # 示例参考帮助文档 # 我用Rstudio重现了所有示例 # 初识R语言,请戳我的原创推文""与"" # 使用 ...
- C语言函数大全--c开头的函数之复数篇
C语言函数大全 c 开头的函数之复数篇 1. cabs,cabsf,cabsl 1.1 函数说明 1.2 演示示例 1.3 运行结果 2. creal,crealf,creall 2.1 函数说明 2 ...
- c 语言 pthread_create_【励达外语】第八篇 语言学习的5个关键期(上)
本主题包含如下内容,因篇幅较长,分上下两篇介绍.# `$ f7 K: w o/ \" G- X8 ^9 Q6 l @# x/ i" \; Q4 m! |! i上篇:语言学习关键 ...
- 深入浅出C语言——C语言简介
文章目录 编程语言: 一.C语言 二.C语言程序案例 三.数据类型 四.变量和常量 五.字符串 六.转义字符 七.注释 八.选择语句 九 .循环语句 十.函数 十一. 数组 十二.操作符 十三.常见关 ...
- 厦门理工计算机课设,厦门理工学院11级C语言C语言程序设计课程设计报告
<厦门理工学院11级C语言C语言程序设计课程设计报告>由会员分享,可在线阅读,更多相关<厦门理工学院11级C语言C语言程序设计课程设计报告(25页珍藏版)>请在人人文库网上搜索 ...
最新文章
- 容器网络Calico进阶实践 | 褚向阳
- NeHe教程Qt实现——lesson14
- socket传输过程
- Win32 API CreateCompatibleDC 函数的相关应用
- (基础)HTML文档结构知识点讲解
- 对10个元素进行快速排序,在最好情况下,元素间的比较次数为( )次。
- JUnit 5符合AssertJ
- 线程和std::shared_ptr智能指针使用
- 启动Eclipse时发生An internal error occurred during: Initializing Java Tooling错误,详细提示如下:...
- eclipse java 注释_Eclipse Java注释模板设置详解
- 监控流媒体服务器连接监控摄像头的配置方式 - GB28181和ONVIF
- php 有request,请问,php中的$_REQUEST是什么意思啊?
- 47. 不用加减乘除做加法(C++版本)
- jQuery:节点操作、事件操作
- 物流仿真在AGV调度方面应用案例
- JAVA 日期格式化
- 【RF】射频集成电路与系统设计
- SOPCAST所有频道的地址
- javaweb项目中连接mysql导入驱动包
- 学习篇之数据分析库pandas