34

Java で重複のない一連の乱数を作成したいと考えています。

たとえば、0 から 9999 までの 10,000 個のランダムな整数を格納する配列があります。

これが私がこれまでに持っているものです:

import java.util.Random;
public class Sort{

    public static void main(String[] args){

        int[] nums = new int[10000];

        Random randomGenerator = new Random();

        for (int i = 0; i < nums.length; ++i){
            nums[i] = randomGenerator.nextInt(10000);
        }
    }
}

しかし、上記のコードは重複を作成します。乱数が繰り返されないようにするにはどうすればよいですか?

4

12 に答える 12

50
Integer[] arr = {...};
Collections.shuffle(Arrays.asList(arr));

例えば:

public static void main(String[] args) {
    Integer[] arr = new Integer[1000];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = i;
    }
    Collections.shuffle(Arrays.asList(arr));
    System.out.println(Arrays.toString(arr));

}
于 2013-04-14T14:35:57.363 に答える
9

重複のない乱数を生成する単純なアルゴリズムは、Programming Pearls p. 127。

注意: 結果の配列には、番号が順番に含まれています! それらをランダムな順序で並べたい場合は、Fisher-Yates shuffleを使用するか、List を使用して を呼び出して、配列をシャッフルする必要がありますCollections.shuffle()

このアルゴリズムの利点は、可能なすべての数値を含む配列を作成する必要がなく、実行時の複雑さが線形であることO(n)です。

public static int[] sampleRandomNumbersWithoutRepetition(int start, int end, int count) {
    Random rng = new Random();

    int[] result = new int[count];
    int cur = 0;
    int remaining = end - start;
    for (int i = start; i < end && count > 0; i++) {
        double probability = rng.nextDouble();
        if (probability < ((double) count) / (double) remaining) {
            count--;
            result[cur++] = i;
        }
        remaining--;
    }
    return result;
}
于 2015-04-20T14:04:33.090 に答える
3

間隔のある数値を生成する必要がある場合は、次のようになります。

Integer[] arr = new Integer[((int) (Math.random() * (16 - 30) + 30))];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
System.out.println(Arrays.toString(arr));`

結果:

[1, 10, 2, 4, 9, 8, 7, 13, 18, 17, 5, 21, 12, 16, 23, 20, 6, 0, 22, 14, 24, 15, 3, 11, 19]

ノート:

ゼロが残らないようにする必要がある場合は、「if」を置くことができます

于 2016-12-12T01:55:40.223 に答える
-1
public class Randoms {

static int z, a = 1111, b = 9999, r;

public static void main(String ... args[])
{
       rand();
}

    public static void rand() {

    Random ran = new Random();
    for (int i = 1; i == 1; i++) {
        z = ran.nextInt(b - a + 1) + a;
        System.out.println(z);
        randcheck();
    }
}

private static void randcheck() {

    for (int i = 3; i >= 0; i--) {
        if (z != 0) {
            r = z % 10;
            arr[i] = r;
            z = z / 10;
        }
    }
    for (int i = 0; i <= 3; i++) {
        for (int j = i + 1; j <= 3; j++) {
            if (arr[i] == arr[j]) {
                rand();
            }
        }

    }
}
}
于 2014-07-11T07:07:48.427 に答える
-1
HashSet<Integer>hashSet=new HashSet<>();
Random random = new Random();
//now add random number to this set
while(true)
{
    hashSet.add(random.nextInt(1000));
    if(hashSet.size()==1000)
        break;
}
于 2018-09-20T09:39:57.023 に答える