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

C语言硬币翻转模拟器计数异常求助:随机数使用问题

C语言硬币翻转模拟器问题修复方案

你的代码存在几个关键问题,导致统计结果出现随机大数,且翻转逻辑完全不符合预期,以下是问题分析和修复方案:

问题点分析

  • 统计变量初始化错误:numHead和numTails是用来统计次数的计数器,你却用rand()给它们初始化,这直接导致初始值就是随机大数,后续累加后自然超出输入次数范围。
  • 翻转逻辑错误:循环内判断的是总翻转次数numFlip的奇偶性,而不是每次硬币翻转的随机结果。这意味着如果输入次数是偶数,所有循环都会统计为正面;如果是奇数,所有循环都统计为反面,完全没有随机模拟的效果。
  • 未初始化随机数种子:使用rand()前没有调用srand(time(NULL))设置随机种子,会导致每次运行程序得到的随机序列完全一致,无法模拟真实的随机翻转。
  • 输入类型不匹配:getdouble()返回的是浮点类型,直接赋值给int变量numFlip可能导致输入小数时被截断,不符合“输入整数次数”的需求。

修复后的代码

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

int main(void) {
    printf("Coin Flip Simulator\n");
    printf("How many times do you want to flip the coin? ");
    
    // 改用scanf读取整数,避免类型不匹配问题
    int numFlip;
    if (scanf("%d", &numFlip) != 1 || numFlip <= 0) {
        printf("Error: Please enter an integer greater than or equal to 1.\n");
        return 1; // 错误退出
    }

    // 初始化随机数种子,确保每次运行随机序列不同
    srand(time(NULL));
    
    int numHead = 0;
    int numTails = 0;
    
    for (int i = 0; i < numFlip; i++) {
        // 每次生成0或1的随机数,模拟硬币翻转
        int flipResult = rand() % 2;
        if (flipResult == 0) {
            numHead++;
        } else {
            numTails++;
        }
    }

    printf("Number of heads: %d\n", numHead);
    printf("Number of tails: %d\n", numTails);
    
    return 0;
}

关键修改说明

  1. 初始化计数器:将numHead和numTails初始化为0,确保从0开始统计次数。
  2. 修正翻转逻辑:每次循环生成rand() % 2的结果(0或1),用这个随机值判断是正面还是反面,实现真实的随机模拟。
  3. 添加随机种子初始化:调用srand(time(NULL)),以当前时间作为随机种子,保证每次运行程序的随机结果不同。
  4. 修复输入处理:改用scanf("%d", &numFlip)直接读取整数,并在输入无效时直接退出程序,避免后续逻辑执行错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:25:15