C语言中使用drand48()和srand48()编译报错的解决方法咨询
解决drand48()/srand48()在Windows IDE中编译报错的问题
问题原因
drand48()、srand48()是POSIX标准规定的随机数函数,不属于C语言标准库范畴。Windows平台主流编译器(如Dev-C++使用的MinGW、MSVC)默认不会在<stdlib.h>中包含这些函数的声明,因此即使引入<stdlib.h>,编译器仍会报“隐式函数声明”的警告/错误。
解决方法
方法1:定义_POSIX_C_SOURCE宏(针对MinGW编译器)
在所有头文件包含前添加POSIX标准宏定义,让<stdlib.h>暴露drand48()和srand48()的声明:
#define _POSIX_C_SOURCE 199309L #include <stdio.h> #include <math.h> #include <stdlib.h> int main(){ srand48(1102003); int i, num[5], n, count=0; double random[100], ran; // 输入数字 printf("输入5个数字\n"); for(i=0; i<5; i++) { scanf("%d", &num[i]); } // 生成随机数序列 for (n=0; n<100; n++) { ran = drand48(); random[n] = round(ran * 100); } // 比对数字 for(n=0; n<100; n++) { for (i=0; i<5; i++){ if (num[i] == random[n]) { count += 1; } } } printf("你猜中了%d个数字\n", count); system("PAUSE"); return 0; }
注:该方法适用于支持POSIX扩展的MinGW版本,Dev-C++ 6.3.0使用的MinGW通常支持此设置。
方法2:替换为C标准库随机数函数(若教授允许)
如果可以放弃drand48(),改用C标准库的rand()和srand(),代码调整如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> // 用于获取当前时间作为随机种子 int main(){ srand((unsigned int)time(NULL)); // 用当前时间做种子,避免每次生成相同序列 int i, num[5], n, count=0; int random[100]; // 直接用整数存储,无需double转换 // 输入数字 printf("输入5个数字\n"); for(i=0; i<5; i++) { scanf("%d", &num[i]); } // 生成随机数序列 for (n=0; n<100; n++) { random[n] = rand() % 101; // 生成0-100的整数 } // 比对数字 for(n=0; n<100; n++) { for (i=0; i<5; i++){ if (num[i] == random[n]) { count += 1; } } } printf("你猜中了%d个数字\n", count); system("PAUSE"); return 0; }
注:rand()的随机性略逊于drand48(),但完全符合C标准,跨平台兼容性更好。
方法3:手动实现drand48()逻辑
如果必须严格使用drand48的算法,可自行实现基于线性同余生成器(LCG)的伪随机数逻辑:
- 种子初始值由srand48设置,每次调用drand48时,种子更新为
(a * seed + c) mod m,其中a=0x5DEECE66D,c=0xB,m=2^48 - drand48返回种子高32位除以2^32的结果(即0.0到1.0之间的双精度浮点数)
自行编写函数可完全摆脱平台依赖。
内容的提问来源于stack exchange,提问作者Phys
相关产品推荐
相关产品推荐

