不使用time.h库生成随机数的技术实现问题
解决无time.h时的随机数种子问题
首先,你遇到的getpid()未声明问题,是因为这个函数属于<unistd.h>头文件,而你的作业只允许使用<stdio.h>、<stdlib.h>和<string.h>,所以编译器找不到它的定义。下面给你两个完全符合要求的可行方案:
方案1:利用局部变量地址自动生成种子
现代操作系统大多开启了地址空间布局随机化(ASLR),程序每次运行时,局部变量的内存地址都会随机变化。我们可以把某个局部变量的地址转换成unsigned int(srand()要求的参数类型)作为种子,完全不需要额外头文件,代码修改如下:
#include <stdio.h> #include <stdlib.h> int main(void) { int minute, hour, day, month, year; // 用局部变量的地址作为随机种子,ASLR会让这个值每次运行都不同 srand((unsigned int)&minute); // 简化rand写法,和原逻辑完全等价 minute = rand() % 60; // 生成0-59的分钟数 hour = rand() % 24; // 生成0-23的小时数 day = rand() % 31 + 1; // 生成1-31的日期 month = rand() % 12 + 1; // 生成1-12的月份 year = 2018; printf("Transferred successfully at %02d:%02d on %02d/%02d/%d\n", hour, minute, day, month, year); return 0; }
这个方案的优点是完全自动,不需要用户交互,在绝大多数现代系统上都能生成不同的随机序列。
方案2:让用户输入种子(更可控)
如果作业允许用户交互,你可以让用户输入一个整数作为种子,这样用户能通过不同输入得到不同的随机结果,代码如下:
#include <stdio.h> #include <stdlib.h> int main(void) { int minute, hour, day, month, year; unsigned int seed; printf("Enter a random seed (any integer): "); scanf("%u", &seed); srand(seed); minute = rand() % 60; hour = rand() % 24; day = rand() % 31 + 1; month = rand() % 12 + 1; year = 2018; printf("Transferred successfully at %02d:%02d on %02d/%02d/%d\n", hour, minute, day, month, year); return 0; }
补充小技巧
你原来写的rand() % (59 + 1 - 0) + 0可以直接简化成rand() % 60,逻辑完全一致,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Angus Ryan
相关产品推荐
相关产品推荐

