2016-10-07 6 views
1

私は過去数時間にわたって牛と雄牛のプログラムを作成しようとしています。牛と牛で。このプログラムは、ユーザーが推測できるように0と9の間に4つの非繰り返し整数を生成することになっていますが、私のプログラムは約10回の繰り返し値を持つ整数のグループを出力します。私が行った誰もがエラーを発見していない、あなたが修正を知っていれば私を助けてください。今までの私のプログラムは次の通りです:牛と雄牛の反復

Random rng = new Random(); 
    int pos1 = rng.nextInt(10); 
    int pos2 = rng.nextInt(10); 
    int pos3 = rng.nextInt(10); 
    int pos4 = rng.nextInt(10); 
    int norepeat = 0; 

    while(norepeat == 0){ 
     if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){ 
      pos4 = rng.nextInt(10); 
     } 
     if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){ 
      pos2 = rng.nextInt(10); 
     } 
     if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){ 
      pos3 = rng.nextInt(10); 
     } 
     if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){ 
      pos4 = rng.nextInt(10); 
     } 
     else { 
      norepeat = 1; 
     } 
} 


    System.out.print(pos1); 
    System.out.print(" " + pos2); 
    System.out.print(" " + pos3); 
    System.out.print(" " + pos4); 
+0

サイズ10の配列(0〜9)をシャッフルし、最初の4つのインデックス(0〜3)を使用します。 –

答えて

3

ここに私のやりたいことがあります。このコードが実行されると、0〜9の範囲の4つの異なる整数のセットが得られます。

Random rng = new Random(); 
Set<Integer> numbersFound = new HashSet<>(); 
while(numbersFound.size() < 4) { 
    numbersFound.add(rng.nextInt(10)); 
} 

これは、Setインターフェイスの実装が一意性を強制するために機能します。セットに数字を追加すると、すでにそこに入っていても効果はありません。

+0

Davidさん、ありがとうございます。しかし、if文のグループが同時に動作していたことが判明し、繰り返し整数を区切るとエラーが発生しました。最初のものがfalseを返すまで2番目のif文が動作しないように変更しました.3番目と4番目のものと同じことを繰り返しました。 – Damerow

2

問題はここにある:

if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){ 
    pos4 = rng.nextInt(10); 
} 
if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){ 
    pos2 = rng.nextInt(10); 
} 
if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){ 
    pos3 = rng.nextInt(10); 
} 
if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){ 
    pos4 = rng.nextInt(10); 
} 
else { 
    norepeat = 1; 
} 

あなただけif秒の最後にelseを持っています。つまり、重複している場合は最初の3つのポジションに新しい値が生成されますが、4番目のposも重複しない限り、新しい値が重複していないかどうかを確認しません。また、最初のifposの代わりにpos4と設定します。コードを次のように変更してください:

if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){ 
    pos1 = rng.nextInt(10); 
} else if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){ 
    pos2 = rng.nextInt(10); 
} else if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){ 
    pos3 = rng.nextInt(10); 
} else if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){ 
    pos4 = rng.nextInt(10); 
}else { 
    norepeat = 1; 
} 

いずれかが重複している場合は、繰り返します。

+0

それは繰り返しチェックがたくさんあります(私はそれがOPのコードであり、おそらくこのようにコード化しないでしょう)。 –

+0

最初の条件体に 'pos4 = ...'を書きました。 'pos1 = ...'を意味しましたか? – Gendarme

+1

@Gendarme OPは最初の条件の本文に 'pos4'を書いて、それを' pos1'に修正しました。 –

0

毎回ご

if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){ 
      pos4 = rng.nextInt(10); 
     } 

がない場合elseステートメント内のコードを実行されることが判明しています。 これを解決する方法の1つは、レスマンが彼の答えで行うようにすることです。

しかし、別の可能な解決策は、これは毎回値を確認して、同じ時間であなたのほとんどを維持しながら数字は、異なるループを終了します以下

if(pos4!=pos1 && pos4!=pos3 && pos4!=pos2 && pos3!=pos2 && pos3!= pos1 && pos2!=pos1){ 
       norepeat = 1; 
      } 

とelse文を交換することですタクトのコード。

+0

これはもう少しCPU時間を要します。 –

+0

引数がないので、私は主にOPのオプションとして、元のコードと同様の原則を使用してそれを実行できる方法を表示するように投稿していました。 – Chains

1

my comment statesの実装方法が不思議だった場合は、次のコードを参考にしてください。

public static void main (String[] args) { 
    // declare and populate a size 10 array of 0 - 9 
    int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 

    // shuffle the array 'a' 
    shuffleArray(a); 

    // output the first four indices of 'a' 
    System.out.printf("%d%d%d%d%n", a[0], a[1], a[2], a[3]); 
} 

// method used to shuffle a passed in array 'ar' using the Durstenfeld shuffle 
public static void shuffleArray(int[] ar) { 
    Random rnd = new Random(); 

    for (int i = ar.length - 1; i > 0; --i) { 
     int index = rnd.nextInt(i + 1); 

     // simple swap 
     int tmp = ar[index]; 
     ar[index] = ar[i]; 
     ar[i] = tmp; 
    } 
} 

上記のコードは、4つの番号しか必要ないので、4回交換するだけでより効率的にすることができます。最初の4つではなく、配列の最後の4つのインデックスを取得する必要があります。これは、配列が最後から順にシャッフルされるためです。

好奇心が強い場合はDurstenfeld shuffleへのリンクがあります。

0

if文がすべて同時に動作していることがわかりました。 Iv'eは以来、彼らが順次動作するように書き直しています。 HERESにアップデートソース:私はあなたが重複なしで4桁のシリーズを作成するために使用できるrandom.sampleを発見した鉱山のモックとしてあなたGCSEを行った後

Random rng = new Random(); 
    int pos1 = 123; 
    int pos2 = 458; 
    int pos3 = 143; 
    int pos4 = 234; 

    int norepeat = 0; 

    pos1 = rng.nextInt(10); 
    pos2 = rng.nextInt(10); 
    while(norepeat == 0){ 
     if(pos2 == pos1){ 
      pos2 = rng.nextInt(10); 
     }else{ 

      pos3 = rng.nextInt(10); 
      if(pos3 == pos1 || pos3 == pos2){ 
       pos3 = rng.nextInt(10); 
      }else{ 
       pos4 = rng.nextInt(10); 
       if(pos4 == pos1 || pos4 == pos2 || pos4 == pos3){ 
        pos4 = rng.nextInt(10); 
       }else{ 
        norepeat = 1; 
0

str(random.sample(range(9), 4)) 

残念ながら、さまざまな角括弧、カンマ、およびスペースを取り除くには、複数の ".replace"コマンドを使用する必要があります。

関連する問題