【C】揭秘rand()函数;
原文地址:http://www.cnblogs.com/ngnetboy/archive/2012/11/23/2784078.html
1 #include<stdio.h>2 #include<stdlib.h>3 int main(void)4 {5 int j;6 for(j=0;j<5;j++)7 {8 printf("rand():%d\n",rand());9 } 10 }
linux下gcc每次运行结果如下:
windows vc6.0每次运行结果如下:(本人windows系统为64位机)
(由于编译器的不同,可能显示的结果也不同吧!)
rand()函数不是随机的吗?怎么每次运行的结果都是一样的?其实计算机也不像人们想象的那么智能,它也是按照人们的思想来随机出数的。本人在linux下查找头文件没有找到rand()函数的定义,上网查了一下也没找到,说是被封装到库中了。若是有大牛们看到这篇文章,请帮帮小弟解决心中的疑问吧!
那么如何用rand()函数获取你想要的取值范围呢?其实rand()函数的取值范围在0~RAND_MAX之间;
那么什么是RAND_MAX呢?
linux下的RAND_MAX值为2147483647(二进制32位)
windows下的RAND_MAX值为32767(二进制16位)
由此可见RAND_MAX是根据编译器对int型分配的空间而定的;这种说法应该也是错的,因为我在windows下的vc中打印sizeof(int)的值之后竟然显示4,也就是说int在vc中的存储空间应该是32位,所以我认为是vc编译器对rand()函数的定义做了修改,使RAND_MAX的值更小,方便了开发者的取值;(下面会介绍为什么编译器这样做)
我们知道了rand()函数的取值范围后,如何取得你想要的数值范围呢?我们取0~10的值好了。正常的思路如下,10*rand()/(RAND_MAX+1)+1(用10乘以rand()取得的随机数,然后除以RAND_MAX,再加1),应该是这样的了。代码如下:
1 #include<stdio.h>2 #include<stdlib.h>3 int main(void)4 {5 int i;6 for(i=0;i<3;i++)7 {8 d=rand();9 c=1 + (10*d/(RAND_MAX)); 10 printf("1 + (10*rand()/(RAND_MAX+1)):%d\n",c); 11 } 12 13 }
运行结果如下:
好像也达到我们的效果了。但是如果把这段代码放到linux下用gcc编译又是什么样的结果呢?
同样的代码,我们来看看结果
这是怎么回事?为什么同样的代码,到了另一个编译器后就不一样了?
还记得我们刚才分别在这两个编译器中求的RAND_MAX的值吗?对,vc中是32767,而gcc中是2147483647。这时候你该问了跟这个有关系吗?我可以十分肯定的告诉你,相当的有关系。我们来写个小程序验证我的猜想吧!代码如下:
1 #include<stdio.h>2 #include<stdlib.h>3 int main(void)4 {5 int i,a,d;6 for(i=0;i<5;i++)7 {8 d=rand(); 9 a=d*10; 10 printf("%d",sizeof(int)); 11 printf("rand()*10:%d\n",a); 12 } 13 }
运行结果如下:
你看出有什么不一样了吗?对,这就是vc为什么对rand()函数的RAND_MAX的值进行修改了。在gcc中rand()的取值范围是0~32位的二进制数,如果拿这个随机数乘以10的话,很可能会发生数值溢出,也就是说gcc中int的值最大就取到2147483647,如果乘以10的话,只能接着往后排列了,-2147483647、-2147483646、-2147483645········一直到取得的那个值。所以会得到一些负数。
到了这里我想你应该知道解决的办法了吧~!没错,就是用一个double类型的数来接收rand()*10,我们没办法改变RAND_MAX的值,我们可以用更大的数来表示rand()*10。
这下应该可以了吧,我们修改一下代码看看效果:
1 #include<stdio.h>2 #include<stdlib.h>3 int main(void)4 {5 int i,a,d;6 for(i=0;i<5;i++)7 { 8 printf("(int)(10.0*rand()/(RAND_MAX+1.0)):%d\n",1+(int)(10.0*d/(RAND_MAX+1.0)));9 } 10 }
运行结果如下:
对,这就是我们想要的结果了!
PS——函数会随着编译器的不同而效果不同,但是它终究逃不过开发者的眼睛,注意细节。
附加:
取0-1之间的浮点型值:
1 #include <stdio.h>2 #include<stdlib.h>3 #include<time.h>4 5 int main(void)6 { 7 int i;8 float a;9 srand((unsigned)time(NULL)); 10 for(i=0;i<10;i++) 11 { 12 printf("%.1f\n",rand()/(RAND_MAX+0.1)); 13 } 14 }
srand()函数是设置随机数的种子,由前面的推论可知rand()函数只是一个伪随机函数,srand()函数就是为rand()函数设置种子;time()函数是获取当前的时间,因此第九行代码就是为rand()函数设置一个根据系统时间变化的随机种子,这样代码在每次运行的时候的结果都不会一样了!
转载于:https://www.cnblogs.com/leihupqrst/p/3487334.html
【C】揭秘rand()函数;相关推荐
- C++:rand()函数和srand()函数解读
(1)srand(unsigned int t)这个是设定种子. 因为电脑取随机数是伪随机,只要种子一样,则取出来的数一定一样. 这里用time(0)这个内函数,copy则是返回了当前的时间值. 这个 ...
- C语言中连续调用rand函数,返回值不变
C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...
- MySQL中的RAND()函数使用详解
转自:https://www.jb51.net/article/66697.htm MySQL RAND()函数调用可以在0和1之间产生一个随机数: ? 1 2 3 4 5 6 7 mysql> ...
- c++ stdlib中rand()函数的值范围
范围是0~32767. 库函数中系统提供了两个函数用于产生随机数:srand()和rand(). 原型为: 函数一:int rand(void): 返回一个[0,RAND_MAX]间的随机整数. 函数 ...
- C语言(rand函数)
C语言(rand函数) (2006-09-24 20:41:59) 转载 srand()就是给rand()提供种子seed 1,先看一个例子 #include <iostream> ...
- rand()函数100000随机数_利用随机函数Rand、Randbetween制作抽奖器应用技巧解读
在Excel系统中,随机数函数有两个,分别为Rand和Randbetween,其作用也是不相同的,Rank函数的作用为生成0-1之间的随机数,而Randbetween函数的作用为生成指定范围内的随机数 ...
- C/C++中rand()函数产生随机数的用法
一.rand() 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数.即,rand()会返回一个范围在0到RAND_MAX(32767)之间的伪 ...
- 【C++】rand函数的基本使用
rand()函数用于生成伪随机数,每次生成的随机数都不变,方便我们调试程序. 重要是的随机数的范围公式(适用整数) 公式: 确定范围 加偏移量 例如:a和b是整数 [a,b],范围是b - a + 1 ...
- Rand函数使用和对补码的理解
下面是在牛客网看到的一道题; //假设这n个数的序号依次为0,1,2,...,n-1,数组名为num void knuth1(int* pNum, int m, int n){srand((unsig ...
最新文章
- 【C++】关联容器学习记录
- 中报表导出带表头_来看看Java是 如何优雅的导出 Excel的
- phpcms v9 的表单向导功能的使用方法
- cli3解决 ie11语法错误 vue_【VUE3.0】它来了,2020年09月18日,Vue.js 3.0 正式发布,但是........
- Hibernate注解方式实现1-1双向关联
- (转)Spring Boot(四):Thymeleaf 使用详解
- C Primer Plus note7
- Office2010安装相关问题及解决方法
- 我的时间管理——任务表
- lsb隐写的基本方法matlab,GitHub - RGNil/RG_LSB: 利用python实现LSB隐写算法(我自己改进了LSB算法),并进行了性能分析(psnr、错误率、鲁棒性)...
- 区块链中的哈希到底是什么?
- AndroidProjects个人项目归纳
- iOS 之归档解档(nskeyarchieve)
- 转录组助力HIV-1病毒感染机制研究新成果
- python kayb算法之从一组序列当中获取一组与目标值最接近的算法
- 用Python将excel表格按照列拆分为多个表格
- html5超链接不加下划线,css怎么让超链接不加下划线
- mongodb关联查询
- 前端学习随笔 css篇
- IRAP 的安装以及运行的实例 主要就是瞎调让程序能跑,,,
热门文章
- python实现二分法查找_python二分法查找
- 64位指针膨胀 java_64位JVM带来的问题及解决方案
- python有几大模块_Python的几个常用模块
- 小波变换原理_基于电压行波原理故障测距的相关问题
- android 10 apk 存储适配,AndroidQ(10) 分区存储适配方法
- c#特性 java注解,Java注解全面了解
- mha数据备份_MHA学习笔记
- java 反转jia链表_Java实现单链表反转
- go mysql rows.next_Go基础之--操作Mysql(二)
- mysql创建gbk库_MYSQL创建utf-8和GBK格式数据库