思路:有点类似于选择排序法,只依靠一个数组,产生后数组的最后n位即为所需的n个随机数。
例如,从1-10取3个不重复的随机数,则初始时:
1 2 3 4 5 6 7 8 9 10| 进行第一遍随机,rander在0-(n-i-1)中选择,n为10,i为遍数,设得3:
1 2 10 4 5 6 7 8 9| 3 将n-i-1与rander对调。然后进行第二遍。i++了,所以随机不重复,设得3
1 2 9 4 5 6 7 8| 10 3 第三遍,假设又得3:
1 2 8 4 5 6 7| 9 10 3 结果三个不重复的随机数就是3,10,9
代码:
template <class Type>
class MyRandom
{
private:
public:
MyRandom()
{
srand((unsigned int)time(NULL));//init random
}
void Rand(Type *source,int length,int randNumber)
{
Type temp;
for(int i=0;i<randNumber;i++)
{
int rander = rand()%(length-i);
temp = source[rander];
source[rander] = source[length-i-1];
source[length-i-1] = temp;
}
}
};
数组为source,由调用函数提供,数组长度length,需要得到的不重复数为randNumber个。
写成模板就可以随机任何元素了,不一定是数字。
调用后,原source的后randNumber位就是随机得到的数