假设要生成前n个自然数的一个随机置换,如{4,3,1,5,2}和{3,1,4,2,5}就是一个合法置换;但{5,4,1,2,1}就不是,因为1出现2次而3没有。假设我们有一个随机数生成器RandInt(i,j),它以相同概率生成i到j之间的整数,下面是三个算法。
(1) 如下填入从A[0]到A[N-1]的数组A:为了填入A[i],生成不同于A[0],A[1],...,A[i-1]之间的随机数时,才将其填入A[i]
(2) 同算法1,但保留一个称为Used数组的附加数组,当一个随机数Ram最初被放入数组A的时候,Used[Ram]=1.这就是说,当用一个随机数填入A[i]时,用Used数组来测试该随机数是否已经被使用。
(3) 请分析上面三种算法各自的时间复杂度,并编 首先填写数组使得A[i]=i+1;然后
For(i=1;i<N;i++)
(1) 如下填入从A[0]到A[N-1]的数组A:为了填入A[i],生成不同于A[0],A[1],...,A[i-1]之间的随机数时,才将其填入A[i]
(2) 同算法1,但保留一个称为Used数组的附加数组,当一个随机数Ram最初被放入数组A的时候,Used[Ram]=1.这就是说,当用一个随机数填入A[i]时,用Used数组来测试该随机数是否已经被使用。
(3) 请分析上面三种算法各自的时间复杂度,并编 首先填写数组使得A[i]=i+1;然后
For(i=1;i<N;i++)
Swap(&A[i],&A[RandInt(0,i)])
代码:#include<stdio.h>
#include<stdlib.h>
#include<time.h>//时间种子
#define LEN 100000
/*
*author:hacker_crazy
*time:2014.9.22
*/
//产生随机数的函数 :因为可能数字很大,所以用long型
long RandInt(long x,long y){
if(x==0){
return rand()%y;
}else{
return rand()%(y-x+1)+x;
}
}
//判断是不是出现过
bool findNumber(long ran,long * a,int i){
int j;
for (j=0;j<i;j++){
if(a[j]==ran){//ran是出现过的自然数
return true;