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

如何让C语言rand()生成不同随机值?实现菜品类型与数量随机

问题解决思路及修正代码

你的代码存在几处核心问题,导致每次运行结果完全一致且逻辑异常,以下是具体修复方案:

问题分析

  1. 未初始化随机种子:rand()默认使用固定种子,每次启动程序生成的随机数序列完全相同。
  2. fork后的随机状态冲突:fork()会复制父进程的内存(包括rand()的内部状态),若在fork后调用rand(),父子进程会生成重复的随机值。
  3. 条件判断逻辑错误:用赋值运算符=替代了比较运算符==,导致分支判断完全失效。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:34