前一篇文章中,我们在Java中用实现两种不同接口的类,解决了不重复选择随机数的问题。现在我们在C++中,通过几种不同的算法来解决上述问题。在下面的四种算法实现中,用的随机函数都是C的库函数,这个函数产生的随机数的范围是限定的,[0, 32767]。当然我们可以通过四则运算来改变取值范围。具体的算法实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include<iostream> #include<ctime> #include<algorithm> #include <set> using namespace std;
void random1(int n,int m) { srand(time(NULL)); for(int i=0;i<n;i++) { if(rand()%(n-i)<m) { cout<<i<<endl; m--; } } }
void random2(int n,int m) { int *a = new int[m]; srand(time(NULL));
a[0]=rand()%n; int temp=0; int j=0; bool flag=true; for(int i=1;i<m;i++) { temp=rand()%n; flag=true; for(j=0;j<i;j++) { if(temp==a[j]) { i--; flag=false; break; } } if(j==i&&flag) a[i]=temp;
}
for(int k=0;k<m;k++) cout<<a[k]<<" "; }
void random3(int n,int m) { int i; srand(time(NULL)); int *a=new int[n]; for(i=0;i<n;i++) a[i]=i; for(i=0;i<m;i++) { int j=i+rand()%(n-i); if(i!=j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; } } for(i=0;i<m;i++) cout<<a[i]<<" "; }
void random4(int n,int m) { set<int> s; srand(time(NULL)); while(s.size()<m) s.insert(rand()%n);
for(set<int>::iterator iter=s.begin();iter!=s.end();iter++) cout<<*iter<<" "; }
void main() { cout<<RAND_MAX<<endl; random4(6,4); }
|