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

使用Math.random()实现抛硬币为何仅得到全正面或全反面结果?

问题原因说明

不是Math.random()随机数生成器的问题,你的代码存在两处核心错误:

  • 随机数生成位置错误:你将flips变量的赋值放在了循环外层,只会在进入函数时生成1次随机结果,整个抛硬币流程都复用同一个结果,自然只会出现全正面或全反面的情况。
  • 随机数范围计算错误:Math.random()返回的是[0.0, 1.0)区间的双精度浮点数,直接强转为int时,所有小于1的正数都会被截断为0,你永远拿不到代表反面的1这个结果。
  • 额外小问题:循环判断条件写了x <= tosses,如果输入抛10次,会实际执行11次抛硬币逻辑,和预期不符。
修正方案

你需要把随机数生成逻辑挪到循环内部,同时调整随机数的范围计算,修正后的完整代码如下:

import java.util.Random;
import java.lang.Math;

class FlipCoin
{
    public static void main(String[] args)
    {
        int[] tracker = new int[2];
        int heads = 0;
        int tails = 1;
        int tosses = 10;

        coinFlip(tracker, heads, tails, tosses);
    }
    
    public static void coinFlip(int[] tracker, int heads, int tails, int tosses)
    {
        // 随机数生成放在循环内,每次抛硬币都生成新的随机值
        for(int x = 0; x < tosses; x++)
        {
            // 乘以2后得到[0.0, 2.0)的数值,转int后只会得到0或1
            int flips =(int)(Math.random() * 2);
            if (flips == heads) 
            {
                tracker[0] ++;
                System.out.println("You flipped heads!");
            } 
            else if (flips == tails)
            {
                tracker[1] ++;
                System.out.println("You flipped tails!");
            }
        }

        for(int i = 0; i < tracker.length; i++)
        {
            System.out.println(tracker[i] + " ");
        }

    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:39:00