骰子投掷模拟程序出现异常统计结果,请求排查原因
问题分析与解决方案
核心问题(代码错误,与系统无关)
- 随机数种子重复初始化:你在
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; }
关键修改说明
- 将
srand(time(NULL))移至循环外:随机数种子只需初始化一次,这样rand()才能生成连续的不同随机数,模拟真实的骰子投掷概率分布。 - 初始化计数变量为0:消除内存垃圾值对统计结果的干扰,保证数据准确。
- 替换
6e7为整数60000000:避免浮点数转整数时可能出现的精度误差,逻辑更严谨。
修正后运行,各点数的出现次数会接近10000000次(60000000/6),符合概率预期。
内容的提问来源于stack exchange,提问作者Vynylyn
相关产品推荐
相关产品推荐

