我一直在努力让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和其他随机变量,但我不确定如何将它实现到这个程序中。
答案 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();
}