You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:10:28