java——自己写一个生成随机数的方法

在java中,主要有三种获得随机数的方法:
1、Math.random();这个方法生成的是0~1之间的一个double;
2、java.util的Random类,创建该类的对象来产生随机数(int、float、double、long)
3、System类中的currentTimeMillis()方法,该方法返回一个long类型的毫秒数(1970年1月1日0时0分0秒到目前的一个毫秒数),可以作为随机数;

自己写一个生成随机数的方法

/**
 * @ClassName TestDemo13
 * @Description 随机数
 * @Author lzq
 * @Date 2018/11/30 21:08
 * @Version 1.0
 **/
public class TestDemo13 {
    public static void main(String[] args) {
        double[] r = {15152};  //随便给一个
        //要10个随机数  [5,12]之间
        for(int i = 0;i < 10;i++) {
            System.out.printf("%10.2f\n",5+7*seed(r));
        }

        System.out.println("====================");
        //要10个正态分布的随机数 均值为2 方差 = 3.5^2
        for(int i = 0;i < 10;i++) {
            System.out.printf("%10.2f\n",normality(2,3.5,r));
        }
    }

    /**
     * 生成随机数的方法  产生(0--1)之间的随机数据
     * 要想生成[m,n]之间的随机数 ---->m+(n-m)seed(r)
     * 要想生成[m,n]之间均匀分布的随机数 ---->m+(int)(n-m)seed(r)
     *
     * @param random 这是只有一个元素的double型数组,因为数组是引用类型,方法里面
     * 把它值改了实参也就变了,还可以定义一个属于类的static静态变量来实现也是一样的
     * @return
     */
    public static double seed(double[] random) {
        double base,u,v,p,temp1,temp2,temp3;
        base = 256.0;   //基数
        u = 17.0;
        v = 139.0;  //17*5+139

        temp1 = u*(random[0])+v;  //计算总值
        temp2 = (int)(temp1/base);  //计算商  记得强转,不然就没余数了
        temp3 = temp1-temp2*base;  //计算余数
        random[0] = temp3;    //更新随机种子,方便下一次生成随机数
        p = random[0]/base;
        return p;
    }


    /**
     * 生成正态分布的随机数
     * @param u 正态分布均值
     * @param t 正态分布方差
     * @param random
     * @return
     */
    public static double normality(double u,double t,double[] random) {
        double total = 0.0,result;
        for(int i = 0;i < 15;i++) {  //随便循环足够大的次数就可以了
            total += seed(random);
        }
        result = u+t*(total-6.0);  //生成随机数
        return result;
    }

}
     10.11
     11.73
     11.15
      8.39
     10.44
     10.30
      7.98
     10.47
     10.77
      8.88
====================
     10.67
      1.41
      7.25
      7.18
      8.21
      6.83
     10.04
      3.85
      5.75
      1.74

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/84668458