java教程

java获取不重复随机数的简易算法

位置:首页 > java教程 > java技巧,2016-03-30
方法一通过单个数组简易实现不重复随机数生成,先上源码。/*** 获取随机数组* @param 源数组 * @param size 目标数组大小 * @retur

方法一

通过单个数组简易实现不重复随机数生成,先上源码。

/**
* 获取随机数组
* @param 源数组
 * @param size 目标数组大小
 * @return 随机数组
 */
public static int[] getRandomRes(int[] source,int size){
    if (source == null && size > source.length) {
        return;
    }
    int[] result = new int[size];
    Random random = new Random();
    for (int i = 0; i < size; i++) {
        int randomIndex = random.nextInt(source.length - 1 - i);
        int randomRes = source[randomIndex];
        result[i] = randomRes;
        int temp = source[randomIndex];
        source[randomIndex] = source[source.length - 1 - i];
        source[source.length - 1 - i] = temp;
    }
    return result;
}

下面看图解,数字为数组的index。

第一次循环

黑色数字表示能随机到的数,红色代表不能随机到数。 
因此只能随机到index:0~4的数,假设是2,然后将2与index5互换位置。

第一次循环结果

此时结果result[] = {2}

继续循环

第二次循环

从前index:0~3中循环,假设取出index0,与index4互换

此时结果为result = {2,0}

依次类推。

优点:简单快捷 
缺点:每次无法取到最后一个数。

方法二

不断随机,使用Set去重

/**
*生成随机数组
*@param size 目标数组大小
*@param max 目标数最大值
*/
public Set<Integer> getRandomSet(int size,int max){
    Random random= new Random();
    Set<Integer> result= new LinkedHashSet<Integer>();
    while (generated.size() < size)
    {
        Integer next = rng.nextInt(max) + 1;
        generated.add(next);
    }
}

此处使用LinkedHashSet保证插入顺序与结果相同。

TAGS:java获取不重复随机数

猜你喜欢

NewHot