使用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
相关产品推荐
相关产品推荐

