随机数

来源:互联网 发布:1hhhh新域名网站 编辑:程序博客网 时间:2024/06/05 11:35
1.有2种方法可以产生java随机数

1) 第一种是直接调用java.lang.Math里面的random()方法,就可以产生一个大于等于0到小于等于1的double类型的随机数。

System.out.println("Random number is " + Math.random());

// lang包内的类不用导入就可直接使用

2) 第二种有更加广泛的意义。就是java.util里面有一个Random的类,里面有很多产生各种分布的随机数的方法。
下面就是一些常见的用法:

import java.util.Random;


public class RandomTest {

public static void main(String[] args){

//生成0到1之间的一个double类型的随机数

//这种是静态方法,仅限于这个作用

System.out.println("Random number is " + Math.random());

System.out.println("");

//现在创建一个Random类型的对象

//然后利用这个对象可以生成服从各种分布的随机数

Random rd = new Random();

//均匀分布的整数

System.out.println("int: " + rd.nextInt());

System.out.println("");

//均匀分布的长整数

System.out.println("long: " + rd.nextLong());

System.out.println("");

//均匀分布的浮点数,大于等于0,小于等于1

System.out.println("float: " + rd.nextFloat());

System.out.println("");

//均匀分布的double类型的数,大于等于0,小于1

System.out.println("double: " + rd.nextDouble());

System.out.println("");

//均匀分布的布尔类型值

System.out.println("boolean: " + rd.nextBoolean());

System.out.println("");

//按高斯分布产生的随机数,均值为0,标准差为1

System.out.println("gaussian: " + rd.nextGaussian());

System.out.println("");

}

}

2. 当然,在这些的基础上,可以使用for循环生成一些列的随机值序列。

对于int类型,还可以使用nextInt(int n)来生成 [0,n) 范围内的整数值


//使用代参数的构造方法的Random对象,不同的对象相同的值,生成的随机序列是一样的,这个可以好好试试。

3. 使用带参数的构造方法构造的Random对象: 使用种子为10的Random对象生成[0,10)内随机整数序列: 3 0 3 0 6 6 7 8 1 4 使用另一个种子为10的Random对象生成[0,10)内随机整数序列: 3 0 3 0 6 6 7 8 1 4

4. 关于随机数的种子

我遇到过这样的问题,有一次仿真的时候要在一个方法里面产生随机数,于是我在方法里面写了一个随机数对象,然后通过调用其中的方法来产生需要的随机数值。后来发现仿真速度很慢,经过查找发现原来这样写,每次调用方法都会产生新的随机数对象,并且不是同一个种子,这样我原本想要的符合一定规律的(比如说高斯分布)随机序列就没有达到预期。

于是我改在成员变量中定义一个protected类型的随机类型的变量。然后在方法中进行判断,如果该变量赋值为null的话(   if (rng==null)  ),就赋予其一个值,至于构造方法中的种子的值,随便选一个就好,只要确保不和其它的重复(这里引申出一个新的问题,见下一段),否则就直接执行后面的代码。判断以后再进行取值,就不会多次产生对象。

前面要说的问题是这样的,就是如果你的随机对象构造方法里面的种子数值是一样的话,那么产生出来的随机序列也是一样的,要尽量避免这样的问题。