无法获得随机数

时间:2016-11-09 22:52:47

标签: java arrays random

我一直在努力让headcount变量变得随机但无法解决这个问题

public class Coin
{
    private final int HEADS = 0;
    private final int TAILS = 1;
    private int face;
    private static int seed =0;
    private Random r;
    public Coin ()
    {
        r = new Random(seed);
        flip();
        seed++;
    }
    public void flip ()
    {
        face = r.nextInt(2);
    }
    public int getFace()
    {
        return face;
    }
    public void setFace(int newFace)
    {
        face = newFace;
    }
    public boolean isHeads ()
    {
        return (face == HEADS);
    }
    public String toString()
    {
        String faceName;
        if (face == HEADS)
            faceName = "Heads";
        else
            faceName = "Tails";
        return faceName;
    }
    public static void main(String[] args)
    {
        Coin myCoin = new Coin();
       double randnumber =Math.random();
        int headCount=0;
        for (int i =1; i<=100; i++)
        {
            myCoin.flip();
            if(myCoin.isHeads())
            {
                headCount++;
            }
        }
        System.out.println("If I flip my coin 100 times, I get " + headCount + " heads.");
        headCount =0;
        for (int i =1; i<=100; i++)
        {
            Coin yourCoin = new Coin();
            yourCoin.flip();
            if(yourCoin.isHeads())
            {
                headCount++;
            }
        }
        System.out.println("If I flip 100 coins, I get " + headCount + " tails.");

    }
}

每当我编译它并运行程序时,我得到相同的输出

如果我翻转我的硬币100次,我会得到47个头。 如果我翻转100个硬币,我会得到50个尾巴。

我不明白每次运行程序时如何使47和50成为新的随机数。我看过Math.Random和其他随机变量,但我不确定如何将它实现到这个程序中。

3 个答案:

答案 0 :(得分:1)

你想要的是:  r = new Random(System.currentTimeMillis());

顺便说一句:在给定某种种子的情况下,随机数生成器始终以相同的数字开头。

例如,假设“随机数”生成器添加2以查找下一个随机数。

种子= 9 r(9)= 11; r(11)= 13; r(13)= 15.

然而,不同的种子将导致不同的数字串。

种子= 4 r(4)= 6;

答案 1 :(得分:1)

计算机编程中的随机数并非随机。它们取决于种子价值。如果你每次都给它相同的种子,你将得到相同的序列&#34;随机&#34;每次都是值。

相反,如果您使用Random的空构造函数,它将为您创建基于当前系统nano时间的种子。通过这种方式,您将减少以相同种子开始的机会。

因此,正如其他人已经提到的那样,要么调用空的Random构造函数,要么在创建一个带有种子参数的Random之前自己创建一个伪随机种子。

尽管如此,最好还是假设JDK实施者已经考虑过如何最好地为你生成种子,所以你应该只使用空构造函数。

如果要查看Random类的Java源代码,可以搜索

grepcode java.util.Random.java 

并了解JDK实施者如何创建种子。

答案 2 :(得分:0)

通过直接在类中声明Random而不是方法来解决种子问题。

private Random r = new Random();

public Coin()
{
    int x = r.nextInt();
    flip();
}