生成前N个自然数随机置换的3个程序

问题描述:

假设需要生成前N个自然数的一个随机置换。例如,{4,3,1,5,2}和{3,1,4,2,5}就是合法的置换,但{5,4,1,2,1}却不是,因为数1出现两次而数3却没有。这个程序常常用于模拟一些算法。我们假设存在一个随机数生成器RandInt(i,j),它以相同的概率生成i和j之间的一个整数。

int RandInt(int i, int j)       //srand()放在主函数中了
{
    if(i==0)
        return rand()%(j+1);
    else
        return rand()%(j-i+1) + i;
}

算法一: 时间复杂度O(N2logN)

填入从a[0]到a[n-1]的数组a,为了填入a[i],生成随机数直到它不同于已经生成的a[0],a[1],...,a[i-1]时,再将其填入a[i].

void fun1(int a[], int n)
{
    int tmp;
    for (int i = 0; i < n; i++)
    {
        tmp=RandInt(1, n);
        for (int j = 0; j < i; j++)
        {
            if(tmp==a[j])
            {
                tmp=RandInt(1, n);
                j=-1;
            }
        }
        a[i] = tmp;
    }
}

算法二:时间复杂度O(NlogN)

同算法一,但要保存一个附加的数组,称之为Used(用过的)数组。当一个随机数ran最初被放入数组A的时候,置Used[ran]=1。

void fun2(int a[], int n)
{
    int tmp;
    for (int i = 0; i < n; i++)
    {
        tmp=RandInt(1, n);
        while(used[tmp]!=0)
            tmp=RandInt(1, n);
        a[i]=tmp;
        used[tmp]=1;
    }
}

算法三:时间复杂度O(N)

填写该数组使得a[i]=i+1.然后:

for(i=1; i<N; i++)
swap(&a[i], a[RandInt(0,i)]);
void swap(int &a, int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}

void fun3(int a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        a[i]=i+1;
    }
    for (int i = 1; i < n; i++)
    {
        swap(a[i], a[ RandInt(0, i) ]);
    }
}

运行效果:

原文地址:https://www.cnblogs.com/linhaostudy/p/11147884.html

时间: 2024-10-09 17:40:54

生成前N个自然数随机置换的3个程序的相关文章

寒假 15(前n个数的随机置换的两个算法)(随机数产生)

具体实现过程见substitution of int from 1 to n 随机数算法知识: kitty的随机数算法博客: 蒙特卡洛法:统计实验法,大量模拟求概率,用于不可解析函数,或概率分布,的模拟与计算时 将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解 蒙特卡罗方法解题过程的主要步骤: a.针对实际问题建立一个简单且便于实现的概率统计模型,使所求的量恰好是该模型的概率分布或数字特征. b.对模型的随机变量建立抽样方法,在计算机上进行模拟测试,抽取足

随机生成前N个不重复的整数

package cn.ds; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Random; /** * 测试随机生成前N个不重复的整数 *

shell 生成指定范围随机数与随机字符串 .

shell 生成指定范围随机数与随机字符串 分类:             shell              2014-04-22 22:17     20902人阅读     评论(5)     收藏     举报 shellrandomurandomuuidlinux shell 生成指定范围随机数与随机字符串 1.使用系统的 $RANDOM 变量 [plain] view plaincopyprint? [email protected]:~$ echo $RANDOM 17617 [

【PHP】PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数)

[PHP]PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数) 前言 由于业务需要,我们需要从业务中汇总数据,并生成Excel文件. 思路是这样的 PHP要导出Excel表格文件->找一个好用的第三方库吧->在Composer的Packages里找一个吧->PHPExcel这么多收藏,就它了! PHPExcel 概述 PHPExcel is a library written in pure PHP and providing a set of classes th

C#中生成的随机数为什么不随机?

from:https://www.xcode.me/more/net-csharp-generate-random 随机数生成方法可以说是任何编程语言必备的功能,它的重要性不言而言,在C#中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成5个随机数: for (int i = 0; i < 5; i++) { Random random = new Random(); Console.WriteLine(random

ABP每次生成前都执行bundle设置

ABP项目每次编译mvc项目时都会执行bundle,比较耗时. 可以在项目文件(*.csproj)中发现设置了每前生成前执行的命令 <Target Name="PreBuild" AfterTargets="PreBuildEvent"> <Exec Command="dotnet bundle clean" /> <Exec Command="dotnet bundle" /> </

python中生成一个指定长度的随机字符串实现示例

方法一:定义一个函数,参数为所要生成随机字符串的长度.通过random.randint(a, b)方法得到随机数字,具体函数如下: def generate_random_str(randomlength=16): """ 生成一个指定长度的随机字符串 """ random_str = '' base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' le

VS2012生成不依赖运行时不依赖MFC的MFC程序

1.新建MFC或者Win32工程,全部使用默认设置 2.设置工程属性,展开配置属性,转到:常规~MFC的使用,修改其值,选择“在静态库中使用MFC”(对应MFC工程)或者“使用标准Windows库”(对应Win32工程) 3.设置工程属性,展开配置属性,转到:常规~ATL的使用,修改其值,选择“静态链接到ATL” 4.设置工程属性,展开配置属性,转到:C/C++~代码生成~运行库,修改其值,选择“多线程(/MT)”(对应Release生成配置)或者“多线程(/MTd)”(对应Debug生成配置)

javascript生成n至m的随机整数

摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备. Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.random()*w 第三步Math.random()*w+n 第四步parseInt(Math.random()*w+n, 10) 生成n-m,不包含n但包含m的整数:? 第一步算出 m-n的值,假设等于w 第二步Math