硬币美元随机类java奇怪的问题

硬币美元随机类java奇怪的问题,java,Java,所以基本上我被指派创建一个Coin类,它由一个无参数构造函数、void toss方法和getSideUp方法组成,getSideUp方法返回sideUp字段的值 然后,我必须使用这个类来创建一个抛硬币游戏,基本上我们将一个名为balance的变量设置为0。我还需要3件硬币类的物品:即一角硬币、五分镍币和四分之一硬币。每次他们着陆时,我们都应该将值添加到平衡变量中。游戏结束时,余额超过或等于1美元,如果你赢了gt 1美元 到目前为止,我有以下代码: import hsa.*; import jav

所以基本上我被指派创建一个Coin类,它由一个无参数构造函数、void toss方法和getSideUp方法组成,getSideUp方法返回sideUp字段的值

然后,我必须使用这个类来创建一个抛硬币游戏,基本上我们将一个名为balance的变量设置为0。我还需要3件硬币类的物品:即一角硬币、五分镍币和四分之一硬币。每次他们着陆时,我们都应该将值添加到平衡变量中。游戏结束时,余额超过或等于1美元,如果你赢了gt 1美元

到目前为止,我有以下代码:

import hsa.*;
import java.util.Random;

public class CoinDollar
{
    public static void main (String[] args)
    {
        double balance = 0.0;
        Coin dime = new Coin ();
        Coin nickel = new Coin ();
        Coin quarter = new Coin ();

        while (balance < 1.00)
        {
            dime.toss ();
            nickel.toss ();
            quarter.toss ();

            Stdout.println ("Dime: " + dime.getSideUp ());
            Stdout.println ("Nickel: " + nickel.getSideUp ());
            Stdout.println ("Quarter: " + quarter.getSideUp ());

            if (dime.getSideUp ().compareTo ("Head") == 0)
                balance += 0.10;
            if (nickel.getSideUp ().compareTo ("Head") == 0)
                balance += 0.05;
            if (quarter.getSideUp ().compareTo ("Head") == 0)
                balance += 0.25;

            Stdout.println ("Your current balance is $" + balance);

            Stdout.println ();
        }

        if (balance == 1.00)
            Stdout.println ("You Win!");
        else
            Stdout.println ("You lose! Your balance exceeds $1!");

    }
}


class Coin
{
    private String sideUp;
    private int side;
    private Random abc = new Random ();

    public Coin ()
    {
        side = abc.nextInt (2);
        if (side == 1)
            sideUp = "Head";
        else
            sideUp = "Tail";
    }


    public void toss ()
    {
        side = abc.nextInt (2);
        if (side == 1)
            sideUp = "Head";
        else
            sideUp = "Tail";
    }


    public String getSideUp ()
    {
        return sideUp;
    }
}
这个程序编译得很好,但我认为随机性有问题。只要一角硬币正面朝上,所有东西都正面朝上,反之亦然


任何帮助都将不胜感激。

不要使用Random,只需在side=abc.nextInt 2;处使用intMath.Random*2即可;,减少对对象的需求,并获得相同的结果。

生成随机数时可能出现错误的原因是计算机上生成随机数的方式

计算机具有很强的确定性,因此本质上不太擅长生成随机数。幸运的是,计算机科学家很聪明,他们已经找到了生成伪随机数字序列的方法。这些算法生成这些序列的一种常见方式是从一个称为种子的数字开始。然后序列对种子重复操作,以获得序列的新值。如果关系设计得当,这个数字序列可以被当作随机数传递

通常,随机数生成器根据系统的当前时间进行播种。因此,如果这些生成器中的两个使用相同的编号进行播种,它们将生成相同的编号。因为类是同时生成的,所以生成器将被赋予相同的种子

更多信息可在此处找到:

如果要解决此问题,请通过提供不同的种子来确保随机对象不同,或者使用数学库

side = Math.round(Math.random());

Math.random生成一个介于0和1之间的随机数。Math.round将数字舍入为最接近的整数。因为随机数小于0.5的概率是50-50,所以边为0或1的概率是50-50,这就是你要找的;试试看。这3个随机数可能是使用同一种子创建的,该种子通常基于日期,因此包含相同的序列。我会尝试对3枚硬币使用相同的随机对象。顺便说一句:由于舍入问题,保持双倍值的平衡不是一个好主意:我运行了你的代码,正如@AnubianNoob已经提到的,代码看起来很好,行为也很好。您真的遇到代码问题了吗?还是您认为可能有问题?Random的默认构造函数没有使用相同的种子-它是根据System.nanoTime随机化的。@user3580294我没有看到任何其他问题。使用单个随机数还可以节省内存和处理能力。有趣的是,Math.random也使用随机数。它只是隐藏起来了。@user3580294谢谢你清除了这个系统。纳米时间警告,而我实际上在数学中发现它有一个持久的随机值