读书人

怎么产生多个不同的1到N的随机排列

发布时间: 2013-12-02 12:00:40 作者: rapoo

如何产生多个不同的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移到程序开始处做一次即可。
[解决办法]
引用:
我说的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++可以封装成随机数类。

这是不想自己费脑筋的方法。
自己研究随机数的话,可以自己做伪随机序列发生器。

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


读书人网 >C语言

热点推荐