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

具体实现过程见substitution of int from 1 to n

随机数算法知识:

kitty的随机数算法博客;

蒙特卡洛法:统计实验法,大量模拟求概率,用于不可解析函数,或概率分布,的模拟与计算时

将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解

蒙特卡罗方法解题过程的主要步骤:

a.针对实际问题建立一个简单且便于实现的概率统计模型,使所求的量恰好是该模型的概率分布或数字特征。

b.对模型的随机变量建立抽样方法,在计算机上进行模拟测试,抽取足够多的随机数。

c.对模拟实验结果进行统计分析,给出所求解的“估计”。

d.必要时,改进模型以提高估计精度和减少实验费用,提高模拟效率。

需要随机数产生技术支持,

随机数产生方法:

0~1,乘同余和混合同余,和一种更复杂的——借助0~1分段,离散型随机变量的模拟——连续型随机变量的模拟,逆变换法,舍选法——

c语言中产生随机数:rand函数,srand函数(利用time提供的值为rand设置种子),time函数

随机变量的概率分布函数:

概率分布函数是概率论的基本概念之一。在实际问题中,常常要研究一个随机变量ξ取值小于某一数值x的概率,这概率是x的函数,称这种函数为随机变量ξ的分布函数,简称分布函数,记作F(x),即F(x)=P(ξ<x) (-∞<x<+∞),由它并可以决定随机变量落入任何范围内的概率。

语言知识:

rand,srand,time组合使用产生符合不同要求的随机数

used辅助数组,像bool值一样,可以优化一些避免重复的对比过程

swap函数,传递指针,temp变量

数组文字

如果要使用5,可以直接用5,也可以把5赋给一个变量后使用变量

复合文字就相当于数据5,作为一个常量使用,任何可以使用数组常量的地方都可以使用数组文字,例如给函数传递一个数组参数时

初始化一个命名数组可以省略数组大小,编译器会自动计算元素数目

初始化一个数组文字也可以省略数组大小

圆括号扩起来的类型名紧跟初始化列表,没名称不可引用,必须在创建的时候使用,值和相应类型的数组值相同,为一个地址

原文地址:https://www.cnblogs.com/guguclaire/p/8456621.html

时间: 2024-07-30 23:40:15

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

生成前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

【海量数据处理】N个数中找出最大的前K个数

N个数中找出最大的前K个数,需要用小堆实现. 分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将大数据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素. void AdjustDown(int *a, size_t root, size_t size)//下调 {//小堆 size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (child + 

递归算法输出数列的前N个数

数列1,1,1,3,5,9,17,31,57,105--N大于3时,第N个数为前三个数之和. 1 for (int i = 0; i < 10; i++) 2 { 3 listint.Add(1); 4 } 5 test3(10); 6 test3(); 1 List<int> listint = new List<int>(); 2 int test3(int n) 3 { 4 int result = 1; 5 if (n > 3) 6 { 7 result = t

100万个数中找出最大的前K个数

拿到这个题目我想到了很多方法,但是在我想到的方法中,要把在100万个数中找到前k个数,都不适用.最后通过我的不断研究,我想到了我认为最简单的方法,就是利用堆来做这道题目. 下面我分析一下我用堆排序的思路: 1.我先建一个大小为k的堆. 2.把100万中前k个数放到这个堆中. 3.把这个堆调成小堆. 4.把100万个从k到100万之间的数字拿出来和堆的根结点作比较. 5.如果根结点小于这之间的某一个数,就把这个数拿给根结点,然后继续调成小堆.否则继续找 6.直到找完这100万个数,堆中放的就是最大

javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数

别怪我是一个闷葫芦,没那么多花哨的语言,废话不多说,先说说小实例的要求: 编写一个方法,实现从n-m个数中随机选出一个整数,要求:传递的参数不足两个或者不是有效数字,返回[0-1]之间的随机数,需要解决n和m两个数大小问题,如果m<n,两个参数的值进行交换: 看到这个求随机数的小实例,相信很多人都会写,也写过很多相关的程序代码,所以,重要的知识点没有,旨在给初学者一些启发,大牛可略过! 既然是给初学者看的,那么我们就从最基本的东西一步一步的看,便于理解,先拆分一下要求吧: 1.求一个n-m的随机

Java堆排序,取得前TopN个数

import java.util.Random; /** * Created with IntelliJ IDEA. * User: pengfei.hpf * Date: 14-4-29 * Time: 上午11:45 * To change this template use File | Settings | File Templates. */ public class HeapSortUtil { /** * 用堆排序方法 找出前N个最大的数 * @originalArray 原始数据

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;

75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。

[本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数. [分析] C++ Code 123456789101112   int singleNumber(int *a, int n) {     int ones = 0, twos = 0;     for (int i = 0;