#114 随机数置换

题目描述:

背景:
假设要生成前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++)
                   Swap(&A[i],&A[RandInt(0,i)])

	要求实现以上三个算法的函数:(1对应(1)中的算法,请务必不要弄混)
	void RandomPermutation1(int n);
	void RandomPermutation2(int n);
	void RandomPermutation3(int n);
	在函数中输出为前n个自然数的一个随机置换,用,号分隔
	必须使用教师提供的随机函数,函数原型如下:
	int RandInt(int i, int j); 
	在文件中加入:extern int RandInt(int i, int j); 即可
	(在测试的时候可以使用random函数,但是在向系统提交时必须改成调用RandInt产生随机数)
	
	注意:
              1、逗号为英文输入法中逗号;
              2、输入n不为正整数时,输出error 
              3、在输出的结果后多输出",0"(不含外侧引号)表示输出结束,除此之外,其余任意多余输出视为错误。
	例如:
	1.当参数n = 5时,
	输出格式为
		1,2,3,4,5,0 
        2.例如n = 10时,数组的10个元素输出为2,8,5,1,10,9,3,6,7,4,但是需在结果后增加一个0
        因此最终输出为:
                2,8,5,1,10,9,3,6,7,4,0

参考代码:

#include<stdio.h>
#include<stdlib.h>
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 A[641111];
static int Used[641111];
int main() {

	return 0;
}
void swap(int* a,int* b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}
void RandomPermutation1(int n)
{
	int x;
	int* a=NULL;
	if(n<=0)
	{
		printf("error");
		exit(-1);
	}
	a = (int*)malloc(sizeof(int)*n);
	if (a==NULL)
	{
		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("0\n");
	}
	free(a);
}
void RandomPermutation2(int n)
{
	int x;
	if(n<=0)
	{
		printf( "error" ) ;
		exit(-1);
	}
	int* b=NULL;
	b=(int*)malloc(sizeof(int)*n);
	if (b==NULL)
	{
		printf("error");
		exit(-1);
	}
	int* used=NULL;
	used=(int*)malloc(sizeof(int)*n);
	if(used==NULL)
	{
		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("0\n");
	}
	free(used);
	free(b);
}
void RandomPermutation3(int n)
{
	int* c=NULL;
	if(n<=0)
	{
		printf("error");
		exit(-1);
	}
	c=(int* )malloc(sizeof(int)*n);
	if (c==NULL)
	{
		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("0\n");
	}
	free(c);
}

讲解:

        这题干也太长了趴!

        但不要被吓到,其实就是一个简单的看题敲码,跟着题目要求的一步一步来,就能拿到满分啦。在我的代码中,因为不知道码图是否会多次调用函数,为防止内存不够用,所以使用了malloc()free()函数,当然,一般码图是不会复杂到内存炸掉的,所以也可以不用这两个函数,有兴趣的小伙伴可以自行百科了解。

        另外如果想要对此程序进行调试,可以尝试使用srand()rand()time()函数进行生成随机数。

        最后,不要忘记在最后加一个 ,0

求实求真,大气大为。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fish_in_UESTC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值