首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-12-02 
如何产生多个不同的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移到程序开始处做一次即可。
[解决办法]
引用:
我说的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移到程序开始处做一次即可。
++


热点排行