随机数
来源:互联网 发布:1hhhh新域名网站 编辑:程序博客网 时间:2024/06/05 11:35
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) ),就赋予其一个值,至于构造方法中的种子的值,随便选一个就好,只要确保不和其它的重复(这里引申出一个新的问题,见下一段),否则就直接执行后面的代码。判断以后再进行取值,就不会多次产生对象。
前面要说的问题是这样的,就是如果你的随机对象构造方法里面的种子数值是一样的话,那么产生出来的随机序列也是一样的,要尽量避免这样的问题。