一、完美想法
b = f(a);
a是线性的,而b是唯一,而且看起来是伪随机的。
其中函数f,有个是RSA算法的函数。
二、排除重复
先生成随机数,并用个数组等进行置位或者用HashSet判断为重复与非重复。
if(Arr[rand] == 1) 说明已经生产了这个数,然后继续生产下个随机数。用部分空间保存之前状态,判断次数减少为一次。
但这个有可能一直生产重复的数,数据多了,重复的概率大。
三、下次随机时候,去掉前面的随机数。
public static int[] randomArray(int min,int max,int n){
int len = max-min+1;
if(max < min || n > len){
return null;
}
//初始化给定范围的待选数组
int[] source = new int[len];
for (int i = min; i < min+len; i++){
source[i-min] = i;
}
int[] result = new int[n];
Random rd = new Random();
int index = 0;
for (int i = 0; i < result.length; i++) {
//待选数组0到(len-2)随机一个下标 ,用随机下标替代随机数本身,方面剔除随机到的数
index = Math.abs(rd.nextInt() % len--);
//将随机到的数放入结果集
result[i] = source[index];
//去掉随机到的数,同时把可以随机的index减少一个。
source[index] = source[len];
}
return result;
}