3

だから私はJavaを学ぼうとしていて、リストから単語の組み合わせを生成し、文に配置することを想定しているこのコードを書きました。問題は、名前のみを含む最初のリストからランダムに選択された単語 (名前) が再利用されることです (理由はわかっていますが、「phrase3」または 3 番目のリストが必要かどうかはわかりません。

これが私のコードです:

    package ListOfWords;

     public class test {
   public static void main (String[] args) {
   String[] name = {"Nicole","Ronnie","Robbie","Alex","Deb"};
   String[] action = {"liar","driver","cook","speller","sleeper","cleaner","soccer   
         player"};

 // find out how many words there are in each list
   int nameLength = name.length;
   int actionLength = action.length;

 // Generate two random numbers 
   int  rand1 = (int) (Math.random() * nameLength);
   int  rand2 = (int) (Math.random() * actionLength);

   String phrase1 = name[rand1];
   String phrase2 = action[rand2];

   System.out.print("It is obvious that" + ' ' + phrase1 + " " + "is a better" + " " +  
   phrase2 + " " + "than" + " " + phrase1 + "!" );          
   }
 }

これは私が現時点で得る結果です:

    It is obvious that Robbie is a better cleaner than Robbie!

最初のリストのランダムな名前が再利用されるのを見ると、最初のリストから同じ要素(名前)を選択しないようにするにはどうすればよいですか?

4

4 に答える 4

3

使用する 2 番目の名前を選択するには、3 番目の乱数とフレーズが必要です。例えば:

// Generate two random numbers 
   int  rand1 = (int) (Math.random() * nameLength);
   int  rand2 = (int) (Math.random() * actionLength);
   int  rand3 = (int) (Math.random() * nameLength);

   String phrase1 = name[rand1];
   String phrase2 = action[rand2];
   String phrase3 = name[rand3];

   System.out.print("It is obvious that" + ' ' + phrase1 + " " + "is a better" + " " +  
   phrase2 + " " + "than" + " " + phrase3 + "!" );

編集: フレーズ 1 とフレーズ 3 の両方に同じ名前が選択される可能性を回避するために、次のコードでは、フレーズ 1 ではなくフレーズ 3 を選択するために異なるインデックスが使用されるようにする必要があります。

int  rand1 = (int) (Math.random() * nameLength);
int  rand2 = (int) (Math.random() * actionLength);
int  rand3 = (int) (Math.random() * nameLength);
while(rand1==rand3){
    rand3 = (int) (Math.random() * nameLength);
}

これにより、rand3 は、rand1 と同じでなくなるまで変更されます。rand1 は、phrase1 とphrase3 に異なる名前を選択します。

names 配列に名前が 1 つしかない場合は、無限ループが発生することに注意してください。

于 2013-07-27T23:21:41.303 に答える
2

次のように実行できます。

List<String> randomNames = new ArrayList(Arrays.asList(name));
Collections.shuffle(randomNames);

int randAction = (int) (Math.random() * actionLength);

String phrase1 = randomNames.get(0);
String phrase2 = action[randAction];
String phrase3 = randomNames.get(1);

System.out.print("It is obvious that " +  phrase1 + " is a better " 
     +  phrase2 + " than " + phrase3 + "!" );   
于 2013-07-27T23:30:03.153 に答える
0

たとえば、ランダムを 4 に初期化しているようです。その後、そのインデックスを呼び出すたびに、同じ値が得られます。

その構造では、新しい変数が必要になります。

プログラムの流れを見ると、2 つのラドムを作成します。その後、設定されます。再初期化されることはありません。

別の変数を追加して解決するか、関数を作成して新しい rand を返し、それを I の代わりに渡します

おそらく同じである Phase3 についてのあなたのコメントを見ました。

以下コメントより。まず、名前リストのインデックスを持つ配列を作成します。ランダムに 1 つの値を選択します。このインデックス値をリストの最後の値に置き換え、長さが 1 の別の値を選択します。– Jongware 27 分前 . 魔法。

于 2013-07-27T23:22:31.307 に答える