#include
using namespace std;
extern int RandInt(int i, int j); //老师的随机函数
void RandomPermutation1(int n); //方法一的函数
void RandomPermutation2(int n); //方法二的函数
void RandomPermutation3(int n); //方法三的函数
void Swap(int*a,int*b); //两数交换函数
/*下面是主函数,主函数只是为了验证三个方法的正确性,值可以自己修改*/
int main() //主函数
{RandomPermutation1(8); //调用方法1
printf("\n"); //输出结束符0
RandomPermutation2(8); //调用方法1
printf("\n"); //输出结束符0
RandomPermutation3(8); //调用方法1
printf("\n"); //输出结束符0
system("PAUSE"); //屏幕暂停,以看清运行结果
return 0;} //程序结束
/*方法一的函数主体*/
void RandomPermutation1(int n) //方法一
{int i,j,*A; //定义两个循环变量和一个数组指针
if(n<=0) //如果n不是正整数
{printf("error");return ;} //输出error,并结束函数
A=new int[n]; //分配一个长度为n的整型数组
for(i=0;i {A[i]=RandInt(1,n); //随机产生1-n之间的数
for(j=0;j if(A[i]==A[j]) break; //如果发现相等退出循环
if(j else printf("%d,",A[i]);} //否则输出A[i]
printf("0"); //输出结束符0
delete A; //函数结束前释放掉数组
return ;} //函数结束
/*方法二的函数主体*/
void RandomPermutation2(int n) //方法二
{int i,j,*A; //定义两个循环变量和一个数组指针
bool *Used; //Used数组
if(n<=0) //如果n不是正整数
{printf("error");return ;} //输出error,并结束函数
A=new int[n]; //分配一个长度为n的整型数组
Used=new bool[n]; //分配一个长度为n的整型数组
for(i=0;i for(i=0;i {while(Used[j=RandInt(1,n)-1]);//随机产生1-n之间没有使用过的随机数
A[i]=j+1; //把随机数赋给A[i]
Used[j]=true; //作上已使用的标记
printf("%d,",A[i]);} //输出A[i]
printf("0"); //输出结束符0
delete A; //函数结束前释放掉数组
delete Used; //函数结束前释放掉数组
return ;} //函数结束
/*方法三的函数主体*/
void RandomPermutation3(int n) //方法三
{int i,*A; //定义一个循环变量和一个数组指针
if(n<=0) //如果n不是正整数
{printf("error");return ;} //输出error,并结束函数
A=new int[n]; //分配一个长度为n的整型数组
for(i=0;i for(i=1;i Swap(&A[i],&A[RandInt(0,i)]);//把A[i]和其中一个随机调换
for(i=0;i printf("%d,",A[i]); //输出A[i]
printf("0"); //输出结束符0
delete A; //函数结束前释放掉数组
return ;} //函数结束
/*交换函数主体*/
void Swap(int *a,int *b) //两数交换函数
{int c; //中间变量c
c=*a; //保存a指向的值
*a=*b; //让a指向的值等于b指向的值
*b=c;} //让b指向的值等于a原来的值
/*以下是老师提供的随机函数,这里为了方便调试也一并写出来*/
int RandInt(int i,int j) //这是老师的随机函数,可以不用写
{static bool a=true; //通过静态变量,控制函数首次调用种随机种子
if(a) {srand(time(0));a=0;} //如果函数首次调用,种一个随机种子
if(i==j) return i; //如果i等于j,则函数直接返回i
if(i else return j+rand()%(i-j+1);} //获得j-i之间的随机数