编程珠玑Column12中从n个数中产生随机的m个数

方法1:

 1 void rand1(int n,int m)

 2 {

 3     for(int i=0;i<n;++i)

 4         if(rand()%(n-i)<m)//用n-i比再定义一个num记录还剩几个更好

 5         {

 6             cout<<i<<" ";

 7             --m;

 8         }

 9     cout<<endl;

10 }

方法2:

1 void rand2(int n,int m)

2 {

3     set<int> num;

4     while(num.size()<m)

5         num.insert(rand()%n);

6     for(set<int>::iterator iter=num.begin();iter!=num.end();++iter)

7         cout<<*iter<<" ";

8     cout<<endl;

9 }

方法3:

 1 inline void swap(int *arr,int i,int j)

 2 {

 3     if(i==j)//一定记得要交换的两个元素相同时返回,否则返回总是0

 4         return;

 5     arr[i]=arr[i]^arr[j];

 6     arr[j]=arr[i]^arr[j];

 7     arr[i]=arr[i]^arr[j];

 8 }

 9 

10 void qsort(int *arr,int l,int u)

11 {

12     if(l>=u)

13         return;

14     int m=l;

15     for(int i=l+1;i<=u;++i)

16         if(arr[i]<arr[l])

17             swap(arr,i,++m);

18     swap(arr,l,m);

19     qsort(arr,l,m-1);

20     qsort(arr,m+1,u);

21 }

22 

23 void rand3(int n,int m)

24 {

25     int *num=new int[n];

26     for(int i=0;i<n;++i)

27         num[i]=i;

28     for(int i=0;i<m;++i)

29         swap(num,i,rand()%(n-i)+i);//是randint(i,n-1)而不是rand()%n

30     qsort(num,0,m-1);

31     for(int i=0;i<m;++i)

32         cout<<num[i]<<" ";

33     cout<<endl;

34     delete []num;

35 }

测试程序:

 1 int main()

 2 {

 3     srand(time(NULL));

 4     int n,m;

 5     cout<<"input n and m:"<<endl;

 6     cin>>n>>m;

 7     rand1(n,m);

 8     rand2(n,m);

 9     rand3(n,m);

10     return 0;

11 }

 

你可能感兴趣的:(column)