方法一:
在一个初始为空的集合中插入随机整数,直到填入足够的整数,伪代码如下:
initialize set S to empty
size=0
while size<m do
t=bigrand()%n
if t is not in S
insert t into S
size++
print the elements of S in sorted order
该算法在选择元素时能够保证所有的元素都具有相同的选中概率,它的输出是随机的。
利用C++标准模板库中现有的东西,并将集合称为set:
void gensets(int m,int n)
{
set<int> S;
while(S.size()<m)
S.insert(bigrand()%n);
set<int>::iterator i;
for(i=S.begin();i!=S.end();++i)
cout<<*i<<"\n";
}
C++标准模板库规范保证在O(logm)时间内完成每个插入操作,集合内部迭代需要O(m),所以整个程序需要的时间为O(mlogm)(和n相比,m较小时)。空间消耗较大。
方法二:
弄乱一个n个元素数组。这个数组包含数组的范围是0....n-1;然后排序前m个元素并输出。
for i=[0,n)
swap(i,randint(i,n-1))
2)) 只需要搅乱数组前m个元素,其C++程序:
void genshuf(int m,int n)
{
int i,j;
int *x=new int [n];
for(i=0;i<n;i++)
x[i]=i;
for(i=0;i<m;i++)
{
j=randint(i,n-1);
int t=x[j];x[i]=x[j];x[j]=t;
}
sort(x,x+m);
for(i=0;i<m;i++)
cout<<x[i]<<"\n";
}
该算法使用了n个字的内存并需要O(n+mlogm)时间。