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

骰子投掷模拟程序出现异常统计结果,请求排查原因

问题分析与解决方案

核心问题(代码错误,与系统无关)

  • 随机数种子重复初始化:你在while循环内部每次调用srand(time(NULL)),但time(NULL)返回秒级时间戳,循环执行速度远快于1秒,导致每次循环的种子完全相同,rand()生成的随机数全程一致,最终只会持续统计同一个点数,其他点数的次数要么是内存垃圾值要么几乎无变化。
  • 计数变量未初始化:freq1到freq6没有初始化为0,它们的初始值是内存中的随机垃圾数据,直接导致统计结果混乱。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    // 初始化计数变量为0,确保统计从0开始
    unsigned long int freq1 = 0, freq2 = 0, freq3 = 0, freq4 = 0, freq5 = 0, freq6 = 0;
    unsigned long int L00p = 1;
    unsigned short int DF;

    // 随机数种子仅需初始化一次,放在循环外部
    srand(time(NULL));

    while (L00p <= 60000000) { // 用整数替代浮点数,避免精度问题
        DF = 1 + (rand() % 6);
        switch (DF) {
            case 1: ++freq1; break;
            case 2: ++freq2; break;
            case 3: ++freq3; break;
            case 4: ++freq4; break;
            case 5: ++freq5; break;
            case 6: ++freq6; break;
            default: break;
        }
        ++L00p;
    }

    printf("%s%25s\n", "Dice's Face", "Face Frequency");
    printf("1%25lu\n", freq1);
    printf("2%25lu\n", freq2);
    printf("3%25lu\n", freq3);
    printf("4%25lu\n", freq4);
    printf("5%25lu\n", freq5);
    printf("6%25lu\n", freq6);

    return 0;
}

关键修改说明

  1. 将srand(time(NULL))移至循环外:随机数种子只需初始化一次,这样rand()才能生成连续的不同随机数,模拟真实的骰子投掷概率分布。
  2. 初始化计数变量为0:消除内存垃圾值对统计结果的干扰,保证数据准确。
  3. 替换6e7为整数60000000:避免浮点数转整数时可能出现的精度误差,逻辑更严谨。

修正后运行,各点数的出现次数会接近10000000次(60000000/6),符合概率预期。

内容的提问来源于stack exchange,提问作者Vynylyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:50:47