题目要求
背景
假设要生成前n个自然数的一个随机置换,如{4,3,1,5,2}和{3,1,4,2,5}就是一个合法置换;
但{5,4,1,2,1}就不是,因为1出现2次而3没有。假设我们有一个随机数生成器RandInt(i,j),它以相同概率生成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++)
Swap(&A[i],&A[RandInt(0,i)])
要求的算法
要求实现以上三个算法的函数:(1对应(1)中的算法,请务必不要弄混)
void RandomPermutation1(int n);
void RandomPermutation2(int n);
void RandomPermutation3(int n);
在函数中输出为前n个自然数的一个随机置换,用逗号分隔
注意事项
1、逗号为英文输入法的逗号;
2、输入n不为正整数时,输出error
3、每个函数输出结果之后再输出回车
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
extern int RandInt(int i, int j)
{
int m;
m = i + rand() % (j - i + 1);
return m;
}
void RandomPermutation1(int n);
void RandomPermutation2(int n);
void RandomPermutation3(int n);
int n;
int main()
{
srand((unsigned)time(NULL));
scanf_s("%d", &n);
if (n <= 0) { printf("error");exit(-1); }
RandomPermutation1(n);
RandomPermutation2(n);
RandomPermutation3(n);
return 0;
}
void RandomPermutation1(int n)
{
int x;
int* a = NULL;
if (n <= 0) { printf("error");exit(-1); }
a = (int*)malloc(sizeof(int) * n);
if (NULL == a) { printf("error");exit(-1); }
for (int i = 0;i < n;i++)
{
x = RandInt(1, n);
for (int j = 0;j < i;j++)
{
if (x == a[j])
{
x = RandInt(1, n);
j = -1;
}
}
a[i] = x;
}
for (int i = 0;i < n;i++)
{
printf("%d,", a[i]);
if (i == n - 1)printf("\n");
}
}
void RandomPermutation2(int n)
{
int x;
if (n <= 0) { printf("error");exit(-1); }
int* b = NULL;
b = (int*)malloc(sizeof(int) * n);
if (NULL == b) { printf("error");exit(-1); }
int* used = NULL;
used = (int*)malloc(sizeof(int) * n);
if (NULL == used) { printf("error");exit(-1); }
for (int i = 1;i <= n;++i) used[i] = 0;
for (int i = 0;i < n;i++)
{
x = RandInt(1, n);
while (used[x] != 0)
x = RandInt(1, n);
b[i] = x;
used[x] = 1;
}
for (int i = 0;i < n;i++)
{
printf("%d,", b[i]);
if (i == n - 1)printf("\n");
}
}
void swap(int& m, int& n)
{
int x = m;
m = n;
n = x;
}
void RandomPermutation3(int n)
{
int* c = NULL;
if (n <= 0) { printf("error");exit(-1); }
c = (int*)malloc(sizeof(int) * n);
if (NULL == c) { printf("error");exit(-1); }
for (int i = 0;i < n;i++)
{
c[i] = i + 1;
}
for (int i = 1;i < n;i++)
{
swap(c[i], c[RandInt(0, i)]);
}
for (int i = 0;i < n;i++)
{
printf("%d,", c[i]);
if (i == n - 1)printf("\n");
}
}