编程珠玑第十二章 生成有序随机序列

来源:互联网 发布:淘宝假发多少钱 编辑:程序博客网 时间:2024/05/16 00:40

编程珠玑第十二章的主题是给定0-n-1共n个数,生成m(m<=n)个有序的随机序列,序列不能重复

方法一:最容易想到的就是利用C++中的set容器,不断向set中插入rand()%n的数,直到set的size为M,break即可,set容器会自动将元素排序

方法二:是书上给的解法,扫描数组[0,n),然后令remaining = n,select = m,每次成功选择一个数i,则select -1,每次循环remaining--; 

方法三:对于特定数组list[n],元素为0-n-1,对于前m个数,每次产生一个随机的位于(i,n-1)的数rand,然后交换i和rand的元素,swap(i,rand),最后对前m个数排序即可


这里面有一个比较有意思的逆向思维的问题,假设n = 100万,m = n-10,然后我们真的要去生成100万-10个随机数吗,当然不是,我们只要生成10个随机数,然后用那100万个数除去这10个数,不就是n-10个随机数了吗


#include<stdio.h>#include<time.h>#include<stdlib.h>#include<string.h>/* * Method No_01 */void random_01(int *list,int n,int m){int i,j = 0;int remaining = n,select = m;for(i = 0;i<n;i++){if(rand()%remaining < select){list[j++] i;select--;}remaining--;}}/* *method No_02   set in c++ */ void random_02(set<int> &s,int n,int m){while(1){s.insert(rand()%n);if(s.size() == m)break;}}/* * Method NO_02 */int randint(int x,int y){return rand()%(y-x+1) + x;}/* the elements of list are from to n-1,in order */void random_02(int *list,int n,int m){srand((unsigned int)time(NULL));int i, j;for(i = 0;i<m;i++){swap(&list[i],&list[randint(i+1,n-1)]);}qsort(list,m,sizeof(list[0]),cmp);// sort}


原创粉丝点击