如何让C语言rand()生成不同随机值?实现菜品类型与数量随机
问题解决思路及修正代码
你的代码存在几处核心问题,导致每次运行结果完全一致且逻辑异常,以下是具体修复方案:
问题分析
- 未初始化随机种子:
rand()默认使用固定种子,每次启动程序生成的随机数序列完全相同。 - fork后的随机状态冲突:
fork()会复制父进程的内存(包括rand()的内部状态),若在fork后调用rand(),父子进程会生成重复的随机值。 - 条件判断逻辑错误:用赋值运算符
=替代了比较运算符==,导致分支判断完全失效。 - wait()调用位置错误:所有进程(包括子进程)都执行
wait(NULL),子进程没有子进程,会触发无效调用。
修正后的代码
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <time.h> // 新增头文件用于获取系统时间 int main(){ // 初始化随机种子,仅在父进程执行一次 srand(time(NULL)); for(int i = 0; i <= 4; i++) { // 在fork前生成随机值,确保每个子进程拿到不同的随机结果 int plato = rand() % 2; int cant = rand() % 6 + 1; int cant1 = rand() % 4 + 1; int p1 = fork(); if (p1 == 0) { // 子进程逻辑 if (plato == 0){ printf("\nMesero %d, PPID=%d, pedido de %d postre/s", i, getppid(), cant); printf(", PID=%d\n", getpid()); } else if (plato == 1){ printf("\nMesero %d, PPID=%d, pedido de %d plato/s de alboniga/s", i, getppid(), cant1); printf(", PID=%d\n", getpid()); } exit(0); } else if (p1 < 0) { printf("ERROR al crear proceso\n"); } else { // 仅父进程等待当前子进程结束 wait(NULL); } } return 0; }
关键修改说明
- 初始化随机种子:通过
srand(time(NULL))用当前系统时间作为种子,确保每次程序启动时随机序列不同。 - 提前生成随机数:在
fork()前生成所有需要的随机值,避免父子进程复制相同的rand()状态。 - 修正条件运算符:将
plato = 0改为plato == 0、plato = 1改为plato == 1,恢复正确的分支判断逻辑。 - 调整wait()位置:仅在父进程分支中调用
wait(NULL),避免子进程执行无效等待操作。
内容的提问来源于stack exchange,提问作者愛mar
相关产品推荐
相关产品推荐

