的一种方法,从0与出重复获得N个随机数到N-1是创建这N个数字阵列和创建一个随机数字,它将选择该数组的一个索引。然后从该数组中删除索引,并继续使用N-1号码等。
class NoRepeatRandom
{
private int[] number = null;
private int N = -1;
private int size = 0;
public NoRepeatRandom(int minVal, int maxVal)
{
N = (maxVal - minVal) + 1;
number = new int[N];
int n = minVal;
for(int i = 0; i < N; i++)
number[i] = n++;
size = N;
}
public void Reset() { size = N; }
// Returns -1 if none left
public int GetRandom()
{
if(size <= 0) return -1;
int index = size * Math.random();
int randNum = number[index];
// Swap current value with current last, so we don't actually
// have to remove anything, and our list still contains everything
// if we want to reset
number[index] = number[size-1];
number[--size] = randNum;
return randNum;
}
}
void Test()
{
NoRepeatRandom nrr = new NoRepeatRandom(0, 10);
for(int i = 0; i < 12; i++)
System.out.println("Random number: " + nrr.GetRandom());
}