HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    伪随机数计算公式

    发布时间:2023-05-22 06:35:23     稿源: 创意岭    阅读: 106        

    大家好!今天让创意岭的小编来大家介绍下关于伪随机数计算公式的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    只需要输入关键词,就能返回你想要的内容,有小程序、在线网页版、PC客户端和批量生成器QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    问友Ai官网:https://ai.de1919.comQAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    本文目录:QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    伪随机数计算公式QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    伪随机数的生成方法QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    一般地,伪随机数的生成方法主要有以下3种:
    (1) 直接法(Direct Method),根据分布函数的物理意义生成。缺点是仅适用于某些具有特殊分布的随机数,如二项式分布、泊松分布。
    (2) 逆转法(Inversion Method),假设U服从[0,1]区间上的均匀分布,令X=F-1(U),则X的累计分布函数(CDF)为F。该方法原理简单、编程方便、适用性广。
    (3)接受拒绝法(Acceptance-Rejection Method):假设希望生成的随机数的概率密度函数(PDF)为f,则首先找到一个PDF为g的随机数发生器与常数c,使得f(x)≤cg(x),然后根据接收拒绝算法求解。由于算法平均运算c次才能得到一个希望生成的随机数,因此c的取值必须尽可能小。显然,该算法的缺点是较难确定g与c。
    因此,伪随机数生成器(PRNG)一般采用逆转法,其基础是均匀分布,均匀分布PRNG的优劣决定了整个随机数体系的优劣[7]。下文研究均匀分布的PRNG。QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    听说计算机产生的随机数是伪随机数,公式有谁知道。QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    用S作随机模拟计算
    作为统计工作者,我们除了可以用S迅速实现新的统计方法,还可以用S进行随机模拟。随机模拟可以验证我们的算法、比较不同算法的的优缺点、发现改进统计方法的方向,是进行统计研究的最有力的计算工具之一。
    随机模拟最基本的需要是产生伪随机数,S中已提供了大多数常用分布的伪随机数函数,可以返回一个伪随机数序列向量。这些伪随机数函数以字母r开头,比如rnorm()是正态伪随机数函数,runif()是均匀分布伪随机数函数,其第一个自变量是伪随机数序列长度n。关于这些函数可以参见第14节以及系统帮助文件。下例产生1000个标准正态伪随机数:
    >
    y
    <-
    rnorm(1000)
    这些伪随机数函数也可以指定与分布有关的参数,比如下例产生1000个均值为150、标准差为100的正态伪随机数:
    >
    y
    <-
    rnorm(1000,
    mean=150,
    sd=100)
    产生伪随机数序列是不重复的,实际上,S在产生伪随机数时从一个种子出发,不断迭代更新种子,所以产生若干随机数后内部的随机数种子就已经改变了。有时我们需要模拟结果是可重复的,这只要我们保存当前的随机数种子,然后在每次产生伪随机数序列之前把随机数种子置为保存值即可:
    >
    the.seed
    <-
    .Random.seed
    >
    ……………
    >
    .Random.seed
    <-
    the.seed
    >
    y
    <-
    rnorm(1000)
    作为例子,我们来产生服从一个简单的线性回归的数据。
    #
    简单线性回归的模拟
    lm.simu
    <-
    function(n){
    #
    先生成自变量。假设自变量x的取值范围在150到180之间,大致服从正态分布。
    x
    <-
    rnorm(n,
    mean=165,
    sd=7.5)
    #
    再生成模型误差。假设服从N(0,
    1.2)分布
    eps
    <-
    rnorm(n,
    0,
    1.2)
    #
    用模型生成因变量
    y
    <-
    0.8
    *
    x
    +
    eps
    return(data.frame(y,x))
    }
    S没有提供多元随机变量的模拟程序,这里给出一个进行三元正态随机变量模拟的例子。假设要三元正态随机向量

    n个独立观测,可以先产生n个服从三元标准正态分布的观测,放在一个
    n行3列的矩阵中:
    U
    <-
    matrix(rnorm(3*n),
    ncol=3,
    byrow=T)
    可以认为矩阵U的每一行是一个标准的三元正态分布的观测。设矩阵
    的Choleski分解为

    A为上三角矩阵,若随机向量
    ,则
    。因此,
    作为一个三行
    n列的矩阵每一行都是服从
    分布的,且各行之间独立。经过转置,产生的
    X
    X
    <-
    matrix(rep(mu,n),
    ncol=3,
    byrow=T)
    +
    U
    %*%
    A
    是一个
    n行三列的矩阵。
    有时模拟需要的计算量很大,多的时候甚至要计算几天的时间。对于这种问题我们要善于把问题拆分成可以单独计算的小问题,然后单独计算每个小问题,把结果保存在S对象中或文本文件中,最后综合保存的结果得到最终结果。
    如果某一个问题需要的计算时间比较长,我们在编程时可以采用以下的技巧:每隔一定时间就显示一下任务的进度,以免计算已经出错或进入死循环还不知道;应该把中间结果每隔一段时间就记录到一个文本文件中(cat()函数可以带一个file参数和append参数,对这种记录方法提供了支持),如果需要中断程序,中间结果可能是有用的,有些情况下还可以根据记录的中间结果从程序中断的地方继续执行。
    参考文献:
    http://www.math.pku.edu.cn/teachers/lidf/docs/statsoft/html/s/13.html

    伪随机数计算公式QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

    随机数和伪随机数的计算公式都是什么呀?QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司

      为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。典型情况下,它会输出一个均匀分布在0和1区间内的伪随机变量的值。其中应用的最为广泛、研究最彻底的一个算法即线性同余法。
      线性同余法LCG(Linear Congruence Generator)
      选取足够大的正整数M和任意自然数n0,a,b,由递推公式:
      ni+1=(af(ni)+b)mod M i=0,1,…,M-1
      生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同余序列:
      ni+1=(a*ni+b)mod M i=0,1,…,M-1
      以下是线性同余法生成伪随机数的伪代码:
      Random(n,m,seed,a,b)
      {
      r0 = seed;
      for (i = 1;i<=n;i++)
      ri = (a*ri-1 + b) mod m
      }
      其中种子参数seed可以任意选择,常常将它设为计算机当前的日期或者时间;m是一个较大数,可以把它取为2w,w是计算机的字长;a可以是0.01w和0.99w之间的任何整数。
      应用递推公式产生均匀分布随机数时,式中参数n0,a,b,M的选取十分重要。
      例如,选取M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6,9,……},周期为4。
      取M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期为16。
      取M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2,3,0,1,6,7……},周期为8。
      Visual C++中伪随机数生成机制
      用VC产生随机数有两个函数,分别为rand(void)和srand(seed)。rand()产生的随机整数是在0~RAND_MAX之间平均分布的,RAND_MAX是一个常量(定义为:#define RAND_MAX 0x7fff)。它是short型数据的最大值,如果要产生一个浮点型的随机数,可以将rand()/1000.0,这样就得到一个0~32.767之间平均分布的随机浮点数。如果要使得范围大一点,那么可以通过产生几个随机数的线性组合来实现任意范围内的平均分布的随机数。
      其用法是先调用srand函数,如
      srand( (unsigned)time( NULL ) )
      这样可以使得每次产生的随机数序列不同。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。也可以使用srand函数来人为指定种子数分析以下两个程序段,
      程序段1:
      //包含头文件
      void main() {
      int count=0;
      for (int i=0;i<10;i++){
      srand((unsigned)time(NULL));
      count++;
      cout<<"No"<
      //包含头文件
      void main() {
      int count=0;
      srand((unsigned)time(NULL));
      for (int i=0;i<10;i++){
      count++;
      cout<<"No"<
      No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
      No6=9694 No7=9694 No8=9694 No9=9694 No10=9694
      程序段2的运行结果为:
      No1=10351 No2=444 No3=11351 No4=3074 No5=21497
      No6=30426 No7=6246 No8=24614 No9=22089 No10=21498
      可以发现,以上两个程序段由于随机数生成时选择的种子的不同,运行的结果也不一样。rand()函数返回随机数序列中的下一个数(实际上是一个伪随机数序列,序列中的每一个数是由对其前面的数字进行复杂变换得到的)。为了模仿真正的随机性,首先要调用srand()函数给序列设置一个种子。为了更好地满足随机性,使用了时间函数time(),以便取到一个随时间变化的值,使每次运行rand()函数时从srand()函数所得到的种子值不相同。伪随机数生成器将作为"种子"的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。
      程序段1中由于将srand()函数放在循环体内,而程序执行的CPU时间较快,调用time函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样的,因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子,以后的每次产生随机数都是利用递推关系得到的。 基于MFC的随机校验码生成
      Web应用程序中经常要利用到随机校验码,校验码的主要作用是防止黑客利用工具软件在线破译用户登录密码,校验码、用户名、密码三者配合组成了进入Web应用系统的钥匙。在利用VC开发的基于客户机/浏览器(Client/Server)模式的应用软件系统中,为了防止非法用户入侵系统,通常也要运用随机校验码生成技术。

    以上就是关于伪随机数计算公式相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。QAO创意岭 - 安心托付、值得信赖的品牌设计、营销策划公司


    推荐阅读:

    伪随机数计算公式

    伪随机如何破解时间种子

    伪随机数会重复吗

    景观设计构成要素有哪些(景观设计构成要素有哪些方面)

    网易游戏人气排行榜(网易游戏人气排行榜端游)