user-0 提问: 如何产生多个不同的1到N的随机排列

回复:
user: user-1
content: 你贴出的代码可能1ms就跑完，而time(0)的精度是整秒，所以每次seed都一样反而变成问题。把srand移到程序开始处做一次即可。

user: user-2
content: 引用 楼主 liubin119712 的回复:我说的1到N的随机排列是指：有N个数，每个数都在1到N之间。比方说N=9时，那么873259146就是一个这样的排列。              我已经通过下面的代码产生了一组这样的排列（这个算法是我在大学的算法导论书上看到的，呵呵。。。。）  void GetRandomArray(int arry[],int number) { 	int i,k; 	//srand((int)time(0));// 	for(i=0;i<number-1;i++) 	{ 		k=rand()%(number-i)+i;//使用 %的随机性不是很好，                                       //这个随机性，不是三言两语就说清楚的,建议看书。                                                    		Swap(&arry[i],&arry[k]);  	} }  int main(){  int a[10][9];     srand((int)time(0));//改到这里         for(int i=0;i<10;i++){        for(int j=0;j<9;j++)              a[i] [j] = i+1;              //初始化为 1～9 ，这个初始化代码，可以写到GetRandomArray内部；              //这可以保证不重复，是一个随机序列（随机置换）               //如果用作索引 初始化为 0～n-1 ，这样可以对任意数据做随即置换。                  }            for(int i=0;i<10;i++)        GetRandomArray(a[i],9);     //......     return 0;  }  现在的问题是我想产生很多组这样的排列，每个排列都不同。   怎么办呢？望大神指导一下。。。。 srand 函数在整个程序运行期间，只需要调用一次。 如果希望保持若干互不相关的随机数序列。  那么用一个数据结构保存随机数的种子，每次调用 rand()之前，调用srand 重新 初始化随机数发生器。  举例  struct myrand{ unsigned seed; } ;  void mysrand(struct myRand *sr,unsigned seed) {        srand(seed);        sr->seed =rand();   }  unsigend myrand(struct myRand *sr){        unsigend r = sr->seed;        srand(r);        sr->seed = rand();              return r;   }  这样可以使用同一库函数，生成若干互不相干的随机序列。 C++可以封装成随机数类。  这是不想自己费脑筋的方法。 自己研究随机数的话，可以自己做伪随机序列发生器。  引用 9 楼 angel_su 的回复:你贴出的代码可能1ms就跑完，而time(0)的精度是整秒，所以每次seed都一样反而变成问题。把srand移到程序开始处做一次即可。++

user: user-0
content: 引用 10 楼 lm_whales 的回复:[quote=引用 楼主 liubin119712 的回复:] 我说的1到N的随机排列是指：有N个数，每个数都在1到N之间。比方说N=9时，那么873259146就是一个这样的排列。              我已经通过下面的代码产生了一组这样的排列（这个算法是我在大学的算法导论书上看到的，呵呵。。。。）  void GetRandomArray(int arry[],int number) { 	int i,k; 	//srand((int)time(0));// 	for(i=0;i<number-1;i++) 	{ 		k=rand()%(number-i)+i;//使用 %的随机性不是很好，                                       //这个随机性，不是三言两语就说清楚的,建议看书。                                                    		Swap(&arry[i],&arry[k]);  	} }  int main(){  int a[10][9];     srand((int)time(0));//改到这里         for(int i=0;i<10;i++){        for(int j=0;j<9;j++)              a[i] [j] = i+1;              //初始化为 1～9 ，这个初始化代码，可以写到GetRandomArray内部；              //这可以保证不重复，是一个随机序列（随机置换）               //如果用作索引 初始化为 0～n-1 ，这样可以对任意数据做随即置换。                  }            for(int i=0;i<10;i++)        GetRandomArray(a[i],9);     //......     return 0;  }  现在的问题是我想产生很多组这样的排列，每个排列都不同。   怎么办呢？望大神指导一下。。。。 srand 函数在整个程序运行期间，只需要调用一次。 如果希望保持若干互不相关的随机数序列。  那么用一个数据结构保存随机数的种子，每次调用 rand()之前，调用srand 重新 初始化随机数发生器。  举例  struct myrand{ unsigned seed; } ;  void mysrand(struct myRand *sr,unsigned seed) {        srand(seed);        sr->seed =rand();   }  unsigend myrand(struct myRand *sr){        unsigend r = sr->seed;        srand(r);        sr->seed = rand();              return r;   }  这样可以使用同一库函数，生成若干互不相干的随机序列。 C++可以封装成随机数类。  这是不想自己费脑筋的方法。 自己研究随机数的话，可以自己做伪随机序列发生器。  引用 9 楼 angel_su 的回复:你贴出的代码可能1ms就跑完，而time(0)的精度是整秒，所以每次seed都一样反而变成问题。把srand移到程序开始处做一次即可。++ [/quote]  嗯，确实是这样。  只需在程序开始处调用一次srand，感谢了！

user: user-0
content: 引用 9 楼 angel_su 的回复:你贴出的代码可能1ms就跑完，而time(0)的精度是整秒，所以每次seed都一样反而变成问题。把srand移到程序开始处做一次即可。  嗯，照你说了试了下，果然是这样！ 谢了

user: user-3
content: #include <stdlib.h> void srand(unsigned int seed);

user: user-4
content: void GetRandomArray(int arry[],int number)  {      	int i,k;      	srand(GetTickCount()); 	for(i=0;i<number-1;i++)     	{ 		//k=rand()%(number-i)+i;          		//Swap(&arry[i],&arry[k]);//这个做傻用？       		arry[i]=rand()%number+1;//这样不行？ 	}  }  //函数调用之间sleep一会儿

user: user-0
content: 引用 3 楼 user-4 的回复:需要m组，则GetRandomArray调用m次不就是了  我就是那么想的额，可是不行，产生的排列全部是一样的。   具体代码请看我回复  lm_whales  的

user: user-0
content: 引用 2 楼 lm_whales 的回复:srand((int)time(0));放错地方了  population是一个结构体数组，结构体里有一个整型数组cityArray,CITY_SIZE和POPU_SIZE都是常量

user: user-0
content: 引用 2 楼 lm_whales 的回复:srand((int)time(0));放错地方了  while(i<POPU_SIZE) 	{ 		for(j=0;j<CITY_SIZE;j++) 			population[i].cityArray[j]=j+1; 		 		srand((int)time(0)); 		GetRandomArray(population[i].cityArray,CITY_SIZE); }   我的产生多个排列是在这里，把srand函数放这里了，还是不行额

user: user-4
content: 需要m组，则GetRandomArray调用m次不就是了

user: user-2
content: srand((int)time(0));放错地方了

user: user-0
content: 来个人帮我看下吧。。。。