-1

私はcs 2010クラスにいます。これまでコーディングに取り組んだことはありません。私には大丈夫な先生がいますが、理解するのが難しい非常に厚いアクセントを持っています. 彼は最近、数日かけて完成させるプロジェクトを私たちにくれました。プロジェクトの最後の部分を完了するのに問題がありました。

このプロジェクトでは、0 ~ 9999 の範囲で 10,000 個の乱数を生成し、それらを繰り返さずに 10,000 個の数字の配列に配置するよう求めています。ご覧のとおり、これは基本的に、配列に 0 ~ 9999 の数値を最小から最大の順に配置するように求めています。私の問題は、繰り返されない数字です。私はコードを繰り返さないようにする方法を見つけようとして4時間以上コードに取り組んできましたが、運がありませんでした。オンラインで少なくとも 1 時間検索しましたが、他のすべてのヒントや解決策は役に立ちませんでした。これは私がこれまでに持っているコードです。誰か助けてもらえますか?

 package array.sorter.project;

import java.util.Arrays;
import java.util.Random;

public class Sorting {
public static void main(String args[]){
int[] randomNumbers = new int[10000];

Random rand = new Random();{
for (int i = 1; i < randomNumbers.length; i++) {
  int n = rand.nextInt(10000);
  randomNumbers[i] = n;}


  for (int i = 0; i < randomNumbers.length; i++) {
      int smallestNo = randomNumbers[i];
      int posWithSmallest = i;
      for (int j = i+1; j < randomNumbers.length; j++) {
        int val = randomNumbers[j];
        if (val < smallestNo) {
          smallestNo = val;
          posWithSmallest = j;
        }
      }
      int tmp = randomNumbers[i];
      randomNumbers[i] = smallestNo;
      randomNumbers[posWithSmallest] = tmp;
}
Arrays.sort(randomNumbers);

for (int i = 0; i < randomNumbers.length; i++) {
      System.out.println("Position " + i + " : " + randomNumbers[i]);
    }



    }

}

}
4

4 に答える 4

2

0 から 9999 までの 10000 個の数値をランダムに生成する代わりに、昇順で 0...9999 を生成し、配列をシャッフルします。シャッフルが偏っていないことを確認してください。たとえば、n! 完了する方法 (よくわからない場合は、n = 3 で机上でチェックして、偏りがないかどうかを確認してください)

于 2013-04-19T03:01:25.233 に答える
1

シャッフルを使いたくない場合

private static int[] generateRandom(int count) {
    int[] randomNumbers = new int[count];

    Set<Integer> checker = new HashSet<Integer>();

    Random rand = new Random();
    for (int i = 0; i < count;) {
        int nextInt = rand.nextInt(count);
        if (!checker.contains(nextInt)) {
            randomNumbers[i++] = nextInt;
            checker.add(nextInt);
        }
    }

    return randomNumbers;
}
于 2013-04-19T03:14:23.013 に答える
0

この問題を解決するための O(n) アルゴリズムを書いたのは、『Programming Pearls, 2nd Edition』という本に触発されたものです。コードは以下のとおりです。後で説明します。

    /**
 * randomly select k numbers in [0,n),and sort them in random order.(k<=n)
 */
public static int[] getRandomArray(int n, int k) {
    if (k > n) {
        k = n;
    }
    int[] rets = new int[k]; // store the random ordered number
    int[] array = new int[n];// original array that array[i] is i
    for (int i = 0; i < n; i++)
        array[i] = i;
    Random random = new Random();
    for (int j = 0; j < k; j++) {
        // generate a random number between [j,n) as index
        int index = j + random.nextInt(n - j);
        // swap array[j] and array[index],so array[0..j] are all non-repeat
        // random number
        int temp = array[index];
        array[index] = array[j];
        array[j] = temp;
        // store it in rets
        rets[j] = temp;
    }
    return rets;
}

説明:

to generate non-repeating 10,000 random numbers between 0-9999 

0~ 9999の数字をランダムに並べると考えることができますarray

2、番号 j に対して、[j,n) からインデックスをランダムに選択します。それはインデックスです。

3, j の位置を j から index に入れ替える (eq は index の数を位置 j に入れ替える)

4,ループ j を 0 から k まで、

于 2013-04-19T03:19:53.363 に答える