【问题标题】:Cannot get Random number无法获取随机数
【发布时间】:2016-11-09 22:52:46
【问题描述】:

我一直在努力让 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 成为新的随机数。我查看了 int Math.Random 和其他随机变量,但不确定如何将其实现到该程序中。

【问题讨论】:

标签: java arrays random


【解决方案1】:

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

顺便说一句:随机数生成器总是以相同的数字开始,给定一个特定的种子。

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

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

但是,不同的种子会产生不同的数字串。

种子 = 4 r(4) = 6;

【讨论】:

  • “你想要的是”不一定。简单地使用r = new Random(); 会更容易,因为如果你不这样做,它会在内部生成一个种子。
【解决方案2】:

计算机编程中的随机数并不是真正随机的。它们取决于种子值。如果你每次都给它相同的种子,你每次都会得到相同的“随机”值序列。

如果您对 Random 使用空构造函数,它将为您创建一个基于当前系统纳米时间的种子。这样,您将减少从相同种子开始的机会。

因此,正如其他人已经提到的,要么调用空的 Random 构造函数,要么自己创建一个伪随机种子,然后再创建一个接受种子参数的 Random。

话虽如此,最好假设 JDK 实现者已经考虑过如何最好地为您生成种子,因此您应该只使用空构造函数。

如果想看Random类的Java源码,可以搜索

grepcode java.util.Random.java 

看看 JDK 实现者是如何创建种子的。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多