日期:2014-05-20  浏览次数:20645 次

如何产生0至n-1之间k个不同的随机顺序的随机整数

如题,不知大家有什么好的想法,比如n = 10000000 ,求1000000个小于n的随机数,这些数不重复,顺序是乱的。

谢谢。
------最佳解决方案--------------------
public static void main(String[] args) {
    int n = 10000000, k = 1000000;
    boolean[] appear = new boolean[n];
    Random r = new Random();
    int[] nums = new int[k];
    for (int i = 0; i < k; i++) {
        int j = -1;
        while (appear[j = r.nextInt(n)]);
        nums[i] = j;
        //appear[j] = true;System.out.println(nums[i]);
    }
}

------其他解决方案--------------------
在文件里存1-n个连续的数,用换行符隔开。
随机生成一个小于n的数,作为行号去文件里取,取后删除同时n-1

如果不考虑n的大小,用Collection.shuffle内存乱序一下即可。
------其他解决方案--------------------
既然是顺序是乱的(Set),那每次随意拿一个出来,然后remove掉不就行了。
------其他解决方案--------------------
package com;

import java.util.ArrayList;
import java.util.List;

public class B {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList<Integer>();
        for(int i=1;i<=10000000;i++){
            list.add(i);
        }
        long start=System.currentTimeMillis();
        java.util.Collections.shuffle(list);
        
        System.out.println(System.currentTimeMillis()-start);
    }

}

------其他解决方案--------------------
用random去随机数
添加到set中
如果set的size()小于n-1就继续调用此方法
------其他解决方案--------------------
public static void main(String[] args) {
    int n = 10000000, k = 1000000;
    int[] arr = new int[n];
    for (int i = 0; i < n; i++)
        arr[i] = i;
    Random r = new Random();
    int[] nums = new int[k];
    for (int i = 0; i < k; i++) {
        int j = r.nextInt(n - i) + i;
        nums[i] = arr[j];
        arr[j] = arr[i];