生成前N个自然数的一个随机置换(3个算法)

本文介绍了三种不同的算法,用于生成前N个自然数的一个随机排列。这些算法详细阐述了如何通过编程实现自然数的随机置换,对于理解和应用随机数生成具有实践意义。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int RandInt(int a, int b);

int main()
{
   
   
    int N;
    int i;
    int ii;
    int a;
    int b;
    int duplicates = 0; //判断是否重复
    int *A = NULL;
    
    printf("Input the value of i: ");
    scanf("%d", &a);
    printf("\nInput the value of j: ");
    scanf("%d", &b);
    printf("\nInput the value of N: ");
    scanf("%d", &N);
    A = (int *)malloc(sizeof(int) * N);
    for (i = 0; i < N; i++)
    {
   
   
        if (i == 0)
        {
   
   
            A[i] = RandInt(a, b);
            continue;
        }
        else
        {
   
   
            while ((A[i] 
背景: 假设生成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个自然数一个随机置换,用,号分隔 必须使用教师提供的随机函数,函数原型如下: int RandInt(int i, int j); 在文件中加入:extern int RandInt(int i, int j); 即可 (在测试的时候可以使用random函数,但是在向系统提交时必须改成调用RandInt产生随机数) 注意: 1、逗号为英文输入法中逗号; 2、输入n不为正整数时,输出error 3、在输出的结果后多输出",0"(不含外侧引号)表示输出结束,除此之外,其余任意多余输出视为错误。 例如: 1.当参数n = 5时,如果数组的5个元素为1,2,3,4,5,则在5后加上英文的逗号0, 即输出格式为 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
最新发布
12-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值