转自: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);