输入两个整数m和n,输出0~n-1范围内m个随机整数的有序列表,不允许重复

方法一:Knuth

时间复杂度O(n)

1 void genknuth(int m,int n){
2     for(int i=0;i<n;i++){
3         if(bigrand()%(n-i)<m){
4             cout<<i<<endl;
5             m--;
6         }
7     }
8 }

方法二:每次插入O(log m)

时间复杂度O(m log m)
缺点:(1)set数据结构的空间开销比较大(128M内存大约在m=1,700,000时就不够用了,而该内存可存储32,000,000个int(4个字节)

        (2)当m接近n时,基于集合的算法生成的很多随机数都要丢弃,因为之前已存在集合中

1 void gensets(int m,int n){
2     set<int> s;
3     while(s.size()<m)
4         s.inset(bigrand()%n);
5     for(set<int>::iterator i=s.begin();i!=s.end();i++)
6         cout<<*i<<endl;
7 }

方法三:打乱数组的前m个元素

时间复杂度O(n+m log m),空间复杂度O(n)

 1 void genshuf(int m, int n){
 2     int x[n];
 3     for(int i=0;i<n;i++)
 4         x[i]=i;
 5     for(int i=0;i<m;i++){
 6         j=randint(i,n-1);
 7         swap(x[i],x[j]);
 8     }
 9     sort(x,x+m);
10     for(int i=0;i<m;i++)
11         cout<<x[i]<<endl;
12 }

 

转载于:https://www.cnblogs.com/liuzhiminxd/articles/3963311.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值