怎么产生多个不同的1到N的随机排列
如何产生多个不同的1到N的随机排列我说的1到N的随机排列是指:有N个数,每个数都在1到N之间。比方说N9时,那
如何产生多个不同的1到N的随机排列
我说的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]);
}
}
现在的问题是我想产生很多组这样的排列,每个排列都不同。 怎么办呢?望大神指导一下。。。。 随机数 不重复排列
[解决办法]需要m组,则GetRandomArray调用m次不就是了
[解决办法]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一会儿
[解决办法]#include <stdlib.h>
void srand(unsigned int seed);
[解决办法]你贴出的代码可能1ms就跑完,而time(0)的精度是整秒,所以每次seed都一样反而变成问题。把srand移到程序开始处做一次即可。
[解决办法]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++可以封装成随机数类。
这是不想自己费脑筋的方法。
自己研究随机数的话,可以自己做伪随机序列发生器。
++