rand()在windows和linux下的异同分析
来源:互联网 发布:appium python ios 编辑:程序博客网 时间:2024/04/28 14:52
转自:http://hi.baidu.com/lihui_lihux/item/636c36870f9c5fd6d0f8cd30
刚刚把一个windows下用VC6.0编写的一个程序移植到linux上发现运行结果又问题。问题主要出现在程序中调用了标准C库stdlib.h中的rand()函数并且使用了其中的RAND_MAX变量,具体代码如下:
void InitArray( int Array[], int arr_num, int arr_max )
{
int i;
srand( (unsigned)time( 0 ) ); //Initiate seed of rand()
for(i=0; i<arr_num; i++)
{
Array[i] = (int)( arr_max*rand()/RAND_MAX );
}
}
即用rand函数对一个数组进行随机初始化,在windows下完全没问题,但到了linux下却都初始化成了0。
问题很快找出来了:在windows下,RAND_MAX的值为32767(0x7fff),具体可以打开C:\Program Files\Microsoft Visual Studio\VC98\Include文件下的STDLIB.H文件查看RAND_MAX的定义:
/* Maximum value that can be returned by the rand function. */
#define RAND_MAX 0x7fff
而在linux下,RAND_MAX的值则是最大的32位正整数:2147483647(2的31次方减1:0xffffffff,该数也是欧拉发现的一个梅森素数),也可以打开linux中的stdlib.h文件来查看其定义(/usr/include/stdlib.h):
/* The largest number rand will return (same as INT_MAX). */
#define RAND_MAX 2147483647
从注释还可以看出RAND_MAX的值刚好和INT_MAX的值相同,因为本质上二者都是32位最大正整数。
RAND_MAX在不同OS下的具体值不同也提醒我们在进行代码移植的时候必须将它以及其他类似的情况也考虑进去才能保证移植成功,或者我们在编程的时候干脆避免这样的差异,比如不使用RAND_MAX。
另外呢,从RAND_MAX数的大小上来看,linux下rand()产生的随机数更“随机”一些,因而上面我写的那段代码在linux下可以直接这样写:
Array[i] = (int) (rand()%arr_max);
- rand()在windows和linux下的异同分析
- linux和windows的异同
- linux和windows的异同
- 浅谈windows下消息机制和linux的异同
- C++编程笔记:串口通信在windows环境和linux环境下的异同和代码实现
- windows dll 和 Linux so 的异同
- windows dll 和 Linux so 的异同
- windows dll 和 Linux so 的异同
- windows dll 和 Linux so 的异同
- linux和windows多线程的异同
- uClinux和Linux的异同分析
- TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK
- linux 下libpcap和windows下winpcap 捕获网络数据包的异同
- Linux 下libpcap和Windows下winpcap 捕获网络数据包的异同
- C语言rand()获取随机数和windows下的CryptGenRandom
- 深入分析Windows和Linux动态库应用异同
- 深入分析Windows和Linux动态库应用异同
- 深入分析Windows和Linux动态库应用异同
- JBossESB教程(五)——怎样去调用一个WebService
- 误解程序运行
- java对时间日期的处理
- Sublime Text 2
- memcached的执行流程
- rand()在windows和linux下的异同分析
- java 的*.class文件结构
- NMAP使用实例(六)
- Oracle常用命令——工作记录
- poj 2409
- 数据结构与算法系列-树-二叉树的定义与性质
- hdoj-1002 大数加法
- Androidpn学习与使用6
- Sencha Touch 2学习笔记(一)---环境搭建和开发工具配置