2017-03-20 5 views
2

乱数が前のものと繰り返された場合にその繰り返しを数え、その数を変更するという条件で、0から20の範囲の20の乱数を生成するコードを作る必要があります繰り返されていないものに変換する。私は、コードを実行すると、「ながら」がなかったかのように、自分自身を繰り返していくつかのランダムな数字があり、ランダムの試行を数える

int [] times = new int [21]; 
     int[] randoms = new int [21]; 
     for (int i = 0; i < 20; i++) { 
      times[i] = 0; 
      randoms[i]=(int)(Math.random()*21); 
      //System.out.print(i); 
      if(i>0){ 
       for (int j = 1; j < i+1; j++) { 
        while(randoms[i]==randoms[i-(j)] || randoms[i]==randoms[0]){ 

         System.out.print(i+" , "+j+" "+(i-j)+" * "+randoms[i]); 
         System.out.println(); 
         randoms[i] = (int)(Math.random()*21); 

         times[i]=1+times[i]; 
        } 
       } 

      JOptionPane.showMessageDialog(null, randoms[i]+" "+times[i]); 

しかし:

私はこのコードを持っています。 このエラーを解決するにはどうすればよいですか?

+1

あなたソリューションが最適です。代わりに20のints 1-20の配列を作成し、Fisher-Yatesをシャッフルします –

答えて

1

このライン

randoms[i]=(int)(Math.random()*21); 

文句を言わない0 and 20の間の数を生成します。代わりに、あなたが見つけた後ならば、他の問題は、その数はあなたが別の乱数、と交換し、その後、繰り返しているされているが、あなたがするかどうかをチェックすることはありません。この

randoms[i]=(int)((Math.random()*100)%21); 

のようなものに変更する必要がありますその再生された回数が繰り返されたり、それをチェックするために、あなたは再び乱数を再生した後j=0の値を設定することができ、あなたのforループに戻っていない:

int [] times = new int [21]; 
int[] randoms = new int [21]; 
for (int i = 0; i < 20; i++) { 
    times[i] = 0; 
    randoms[i]=(int)((Math.random()*100)%21); 
    //System.out.print(i); 
    if(i>0){ 
     outerloop: 
     for (int j = 1; j < i+1; j++) { 
      while(randoms[i]==randoms[i-(j)] || randoms[i]==randoms[0]){ 

       System.out.print(i+" , "+j+" "+(i-j)+" * "+randoms[i]); 
       System.out.println(); 
       randoms[i] = (int)((Math.random()*100)%21); 

       times[i]=1+times[i]; 

       //recheck the entire loop again 
       j=1; 
       continue outerloop; 
      } 
     } 

    JOptionPane.showMessageDialog(null, randoms[i]+" "+times[i]); 
関連する問題