2016-11-09 23 views
-1
私はランダムに人員変数を取得するために取り組んできましたが、
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やその他のランダム変数を見てきましたが、このプログラムに実装する方法は不明です。何をしたい

+4

これは、シードを使用する際の重要なポイントです。毎回同じ結果が得られます。 – azurefrog

+0

あなたはそれを少しはっきりと言うことができますか?これはシードを使用した場合の全体です。 –

+1

毎回同じ結果が得られないようにするには、乱数ジェネレータに毎回同じ初期入力をかけないでください。種を設定する全体のポイントは**あなたがプログラム**を実行するたびに同じ結果を保証することです。 – azurefrog

答えて

1

は次のとおりです。 R =新しいランダム(のSystem.currentTimeMillis());

BTW:ランダムな数のジェネレータは、常に一定のシードを指定して同じ番号で開始します。

たとえば、次の乱数を見つけるために「乱数」ジェネレータが2を追加したとします。

シード= 9 r(9)= 11; r(11)= 13; r(13)= 15

ただし、異なる種の文字列は異なる文字列につながります。

シード= 4 R(4)= 6。

+2

「あなたがしたいのは、必ずしもそうではありません。 'r = new Random();'を使うのは簡単です。そうでなければ内部的にシードを生成するからです。 –

1

コンピュータプログラミングの乱数は実際にランダムではありません。彼らは種の価値に依存しています。毎回同じシードを与えると、その都度、同じシーケンスの「ランダム」値が得られます。

の場合は、代わりに、あなたはランダムのために空のコンストラクタを使用し、それが現在のシステムのナノ時間に基づいているあなたのためのシードを作成します。このようにして、同じ種から始めるチャンスを緩和します。

だから、他の人がすでに述べてきたように、空のランダムなコンストラクタを呼び出す、またはシード引数を取るランダムを作成する前に、擬似ランダムシードを自分で作成のいずれか。言ったことすべてで

は、それはJDKの実装は、すでに最高のあなたのためのシードを生成する方法について考えていると仮定しておそらく最高ですので、あなただけの空のコンストラクタを使用する必要があります。

あなたはランダムクラスのJavaソースを見たい場合は、あなたが

grepcode java.util.Random.java 

を検索し、JDKの実装は、種子の作成方法を確認することができます。

0

メソッドの代わりに、クラスの中でランダムを宣言することによって、シードの問題を解決します。

private Random r = new Random(); 

public Coin() 
{ 
    int x = r.nextInt(); 
    flip(); 
} 
関連する問題