导航菜单

生成前N个自然数随机置换的3个程序

假设您需要生成前N个自然数的随机排列。例如,{4,3,1,5,2}和{3,1,4,2,5}是合法替换,但{5,4,1,2,1}不是,因为数字1出现两个数字3不是。该程序通常用于模拟某些算法。我们假设有一个随机数生成器RandInt(i,j)以相同的概率生成i和j之间的整数。

Int RandInt(int i,int j)//srand()放在main函数

{

如果(I==0)

返回rand()%(j + 1);

其他

返回rand()%(j-i + 1)+ i;

}

算法1:时间复杂度O(N2logN)

从[0]到[n-1]填入数组a,为了填入[i],生成一个随机数,直到它与已经生成的a [0],a [1]不同,当[i-1]时,将其填入[i]。

Void fun1(int a [],int n)

{

Int tmp;

对于(int i=0; i< n; i ++)

{

Tmp=RandInt(1,n);

对于(int j=0; j< i; j ++)

{

如果(TMP==一个[j]的)

{

Tmp=RandInt(1,n);

J=-1;

}

}

a [i]=tmp;

}

}

同算法一,但要保存一个附加的数组,称之为使用(用过的)数组。当一个随机数跑最初被放入数组甲的时候,置二手[跑]=1。

void fun2(int a [],int n)

{

int tmp;

for(int i=0; i< n; i ++)

{

tmp=RandInt(1,n);

同时(使用[TMP]!=0)

tmp=RandInt(1,n);

A [1]=TMP;

使用[TMP]=1;

}

}

填写该数组使得A [1]=i + 1的然后:

for(i=1; i

交换(& a [i],[RandInt(0,i)]);

void swap(int& a,int& b)

{

int tmp=a;

A=B;

B=TMP;

}

void fun3(int a [],int n)

{

XX对于(int i=0; i< n; i ++)

{

A [1]=I + 1;

}

对于(int i=1; i< n; i ++)

{

交换(a [i],[RandInt(0,i)]);

}

}

67fddd8465a24740afcface5ebee79a0