0

私のプログラムでは、乱数発生器を使用しています。

Random random = new Random();

//How i use it
int i = random.nextInt(numberNeeded);

問題は、各数値が一度だけ生成される方法を見つける必要があることです。だから私はその完全なランダムではないと思います....たとえば....番号1が生成されたとき、私はそれが再び呼び出されることを望んでいませんが、代わりに他の番号の1つを呼び出します.2、3、または4のように...そして、4がコールされた場合、2または3しかコールできません..

次回、数字がシャッフルされ、プロセスが繰り返されます...

数値は 4 から 16 の範囲である必要があります

4

5 に答える 5

7

選択したい要素のリストでCollections.shuffleを使用する方がおそらくはるかに簡単です。

ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i=4; i<=16; i++)
    numbers.add(i);
Collections.shuffle(numbers);
// numbers is now in a random order and contain the numbers 4 through 16
于 2013-08-24T02:53:00.687 に答える
0

Collections.shuffle を使用できます...

            //Setup your list as needed...
    final List<Integer> list = new ArrayList<Integer>(); 
    list.addAll(Arrays.asList(new Integer[] {
            1, 2, 3, 4 }));


    // Randomizes the list
    Collections.shuffle(list);

    for (Iterator<Integer> i = list.iterator(); i.hasNext();) {
        System.out.println(i.next());
                    //Removes from the list...
        i.remove();
    }
于 2013-08-24T02:58:38.930 に答える
0

最善の方法ではないかもしれませんが、最も簡単な方法はブール配列を使用することです。

//create an array of boolean values set to TRUE
boolean[] isavailable = new boolean[somesize];
Arrays.fill(isavailable, Boolean.TRUE);

//Get a random number
Random r = new Random();
int myrandomnumber=r.nextInt()%25; //Im just going to use 25 for example

if (isavailable[myrandomnumber])
{
   isavailable[myrandomnumber]=false;
   //do whatever you want with the number here
}
else
{
     //Generate another random number here
}

正直なところ、これを while ループに入れるのがおそらく最善です。そうすれば、連続して 2 つ以上の使用できない数値を生成した場合にカバーされますが、これで基本的な考え方が得られるはずです。

于 2013-08-24T03:48:29.333 に答える
0

new Random()最初に、アプリケーションの最初の起動時に一度だけ行うようにしてください。

次に、変数の最後の値を記憶し、一致しなくなるまでループします。

Random random = new Random();

int lastNumber = -1;

while (true)
{
  int i = random.nextInt(numberNeeded);
  if (i == lastNumber) continue;
  lastNumber = i;
  break;
}
于 2013-08-24T02:52:50.467 に答える