简单的抛硬币Java程序

Posted

技术标签:

【中文标题】简单的抛硬币Java程序【英文标题】:Simple flip a coin Java Program 【发布时间】:2020-07-12 19:49:43 【问题描述】:

我正在使用一个随机数类并要求它将总正面数/翻转次数相加....但它不起作用。

任何提示都会有所帮助。

import java.util.Random;
public class FlipaCoin

    public static void main(String [] args)
    
        Random rand= new Random();
        boolean a;
        while (a=true)
        
            int flip=rand.nextInt(2);
            int heads=0;
            if (flip==1)
            
                heads++;
            
            double count=0;
            double percentage=heads/count;
            System.out.println(percentage);
            count++;
            if (percentage==50.0)
            
                break;
            
        
    

【问题讨论】:

声明并初始化 heads 变量 above while 循环(不在其中)。就像现在一样,while 循环的每次迭代都会将 heads 变量设为 0。对 count 执行相同操作。 【参考方案1】:

我已经审查了您的程序并对其进行了修改,并将我的反馈留在了相关位置的 cmets 中。希望这篇评论对您有所帮助!

import java.util.*;

public class FlipaCoin 
  public static void main(String[] args) 
    Random rand = new Random();
    // don't
    // - boolean a;
    // If you're going to test a variable,
    // assign it a default value first
    boolean a = true;

    // Declaring these outside of the `while` loop below allows
    // them to exist through multiple executions of the loop's body
    int heads = 0;
    int count = 0;
    double percentage = 0;

    // It turns out that `percentage == 50.0` never evaluated to `true`, ever
    // Better to pick a limit beyond which
    int samples = 5000;

    // don't - while (a=true) 
    // Using the `=` operator assigns a value to a variable,
    // and this assignment itself results in a true, and loop forever
    // Using the `==` operator compares two operands for equality
    // of values, and returns true if same, false if different
    // This is how to test `a`.
    // while (a == true) 

    // We don't want it to loop forever though, so the condition was revised
    // `<=` is a "less than or equal to" comparison operator
    while (count <= samples) 
      int flip = rand.nextInt(2);
      // don't do this inside the loop
      // - int heads = 0;
      if (flip == 1) 
        heads++;
      
      // don't do these inside the loop
      // - double count = 0;
      // - double percentage = heads / count;
      // Assigning a new value to a variable defined
      // outside the loop is what you want;

      // `(double) count` says "think of this value as a double" in just this line
      // but `count` stays int, so when logging below, it doesn't show as `105.00`
      percentage = heads / (double) count;

      // don't - System.out.println(percentage);
      // Give a little more context for what you're logging! :)
      System.out.println("Sample: " + count + "; Percent: " + percentage);

      count++;

      // don't, this will never succeed
      // - if (percentage == 50.0) 
      // -   break;
      // - 
    
  

【讨论】:

【参考方案2】:

查看 cmets:

import java.util.Random;
public class FlipaCoin

    public static void main(String [] args)
    
        Random rand= new Random();
        int heads=0; //you don't want to reset heads in every loop
        double count=0; //you don't want to reset heads in every loop
        //boolean a; //not needed
        while (true)
        
            int flip=rand.nextInt(2);
            //int heads=0;
            if (flip==1)
            
                heads++;
            
            count++;
            double percentage= heads/count*100 ;// heads/count give fraction, not percentage 
            if (percentage==50.0)
            
                System.out.println(percentage + "achived after "+ count +" flips");
                break;
            
        
    

你也可以使用rand.nextBoolean():

public static void main(String [] args)

    Random rand= new Random();
    int heads=0;
    double count=0;
    while (true)
    
        boolean flip=rand.nextBoolean(); // true half the
        if (flip)
        
            heads++;
        
        count++;
        double percentage= heads/count*100;
        if (percentage==50.0)
        
            System.out.println(percentage + "achived after "+ count +" flips");
            break;
        
    

它的简洁版本:

public static void main(String [] args)

        Random rand= new Random();
        int heads=0, count=0;
        do
        
            heads = rand.nextBoolean() ? heads+1 : heads;
            count++;
        while((double)heads+100/count!= 50);
        System.out.println("50% achived after "+ count +" flips");

【讨论】:

一些 RNG 的低位不是很随机。以防万一我更倾向于使用int flip = rand.nextInt(10000) % 2; 来避免潜在的问题。 YMMV。

以上是关于简单的抛硬币Java程序的主要内容,如果未能解决你的问题,请参考以下文章

Java异常的抛出

机器学习 | EM算法与你所不知道的抛硬币案例

Java中异常的抛出方式

Java中异常的抛出方式

挑战程序设计竞赛(算法和数据结构)——17.1硬币问题(动态规划)的JAVA实现

JavaFXML 协助 - 硬币计数器