zoukankan      html  css  js  c++  java
  • 利用线性同余产生伪随机数+可变参数使用

    一、利用线性同余产生伪随机数:

    1)程序设计原理:

    线性同余方法LCG)是个产生伪随机数的方法。

    它是根据递归公式:

    其中 是产生器设定的常数。

    LCG的周期最大为 =pow(2,31)-1,但大部分情况都会少于M。要令LCG达到最大周期,应符合以下条件:

    一般选取方法:乘数A满足A=4p+1;增量B满足B=2q+1。其中p,q为正整数。

    M值得话最好是选择大的,因为M值直接影响伪随机数序列的周期长短。A和B的值越大,产生的伪随机数越均匀

    A和M如果互质,产生随机数效果比不互质好。

     

    2)源代码

    package homework2;

     

    public class Random {

            

             public static void main(String[] args) {

                       // TODO Auto-generated method stub

                       final int N=1001;

                       double []ran=new double[N];

            double a=Math.pow(7, 5),c=0;

            double m=Math.pow(2,31)-1;

                       ran[0]=1;

                       System.out.println("产生的随机数为:");

                       for(int i=1;i<=1000;++i){

                                ran[i]=(ran[i-1]*a+c)%m;

                                System.out.print((int)ran[i]+" ");

                                if(i%10==0) {

                                         System.out.println("");

                                }

                                if(i%100==0) {

                                         System.out.println("");

                                }

                               

                       }

     

             }

     

    }

    3)结果截图:

     

    4)附带数学知识:

    ①原根定义:

    设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)。

    假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1<g<P, 0<i<P,那么g可以称为是P的一个原根,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立。(这里P是素数)。

    求原根目前的做法只能是从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且当指数为P-1的时候成立,而由于原根一般都不大,所以可以暴力得到。

    ②欧拉函数性质:

    通式:

     

    其中p1, p2……pn为x的所有质因数,x是不为0的整数。

    φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。

    注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

    若n是质数p的k次幂,

    因为除了p的倍数外,其他数都跟n互质。

    设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。

    φ:N→N,n→φ(n)称为欧拉函数。

    欧拉函数是积性函数——若m,n互质,

    特殊性质:

    当n为奇数时,,证明与上述类似。

    若n为质数,则

    二、可变参数使用:

    1)程序设计原理:

    通过设置不同参数类型的同名函数,方便用户的输入,比如此题设置int和double的 square()函数,就不用在输入时选择参数类型。完善程序。

    (2)源代码:

    package homework2;

     

    public class handAndHead {

     

        public static void main(String[] args) {

            // TODO Auto-generated method stub

     

            System.out.println("The square of integer 7 is "+square(7));

            System.out.println(" The square of integer 7 is "+square(7.5));

        }

        public static int square(int x) {

            return x*x;

        }

        public static double square(double y) {

            return y*y;

        }

       

     

    }

    3)程序结果截图:

    4)总结:

    通过定义同名函数的不同参数类型,方便调用,提高程序运行效率。

    三、查看一下JDKSystem.out.println()方法

    (1)截图:

     

     

    (2)发现:

    类似题二的可变参数,可以定义多个不同参数类型的同名函数,这样方便用户进行输入,提高程序的友好性。

  • 相关阅读:
    提升Android编译速度
    NYOJ 158 省赛来了
    浅谈 ZipArchive 类
    块状元素的text-align对齐属性
    BestCoder Round #2 1001 TIANKENG’s restaurant
    Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)
    【HRS项目】Axure兴许问题解决---与SVN结合
    软件质量之道:PCLint之中的一个
    字典树 一种高速插入查询数据结构
    【JS】JavaScript引擎的内部执行机制
  • 原文地址:https://www.cnblogs.com/somedayLi/p/7664301.html
Copyright © 2011-2022 走看看