2017-11-03 4 views
2

私は文字列の配列を持っています。ユーザーが自分のアプリケーション内のボタンをタップすると、乱数を生成し、それを使ってfacts []配列からランダムなStringを選択します。しかし、私は自分のコードを改良して、同じ乱数が "決して"発生しないようにしました(同じ文字列がユーザに表示されるようになりました)。私の努力にもかかわらず、私の「チェック」ブロックは、最初にボタンをクリックして何もしないときにランダムな事実を生成するので、動作しないようです。この背後にある正しいロジックを理解し、より効率的なコードブロックを書くのを助けてください。乱数発生チェック

私の現在のロジック:生成された乱数がint [] factsCheck配列にすでに存在するかどうかをチェックし、別のものを作成するかどうかを確認します。プログラムに認識されるように配列に追加しない場合一度作成されています。 getFactsの初めに

int[] factsCheck = new int[facts.length]; 
boolean isNotNewRandomNumber = true; 
int count = 0; 
int randomNumberToReturn; 

private void initFactsCheck() { 
    for(int i=0; i<=factsCheck.length;i++) { 
     factsCheck[i] = -1; 
    } 
} 

String getFact() { 
    // Randomly select a fact 
    Random randomGenerator = new Random(); 
    while(isNotNewRandomNumber) { 
     randomNumberToReturn = randomGenerator.nextInt(facts.length); 
     for(int i = 0; i<factsCheck.length; i++) { 
      if(factsCheck[i] == randomNumberToReturn) { 
       break; 
      } else { 
       count++; 
      } 
     } 
     if (count == factsCheck.length) { 
      // Doesn't exist 
      isNotNewRandomNumber = false; 
     } 
     count = 0; 
    } 
    return facts[randomNumberToReturn]; 
} 
+2

一般的なメモとデザインの改善と同様に、必要な重複のないランダムロジックの場合、選択肢のリストを保存し、ランダムなものを選択して**リストから削除する方が、それは再び選択することはできず、リストは毎回小さくなります。 :) – xander

+2

また、java.util.Collections.shuffle()メソッドを見ることもできます。 – Henry

答えて

0

()、これを追加します。

isNotNewRandomNumber = true; 

問題は、あなたがgetFacts(呼び出し偽初めてのあなたisNotNewRandomNumber)は、その後、あなたが再びtrueに設定したことがないということです、あなたは再びwhileループに入ることはありません。

私はそれがあなたがする必要があるとは確信していません。他にもエラーがあるかもしれません。 whileループの中にforループを持つ必要はないようです。より良い方法が必要です。また、factsCheck [x]をreturn文の直前の適切な値に設定したいと思うかもしれません。