首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java发作随机数的几种方式

2012-10-29 
java产生随机数的几种方式1.Math.random()java.lang.Mathrandom()  public static double random()  返回

java产生随机数的几种方式
1.Math.random()
   java.lang.Math
   random()
 public static double random()

  返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

   public class RandomTest{
    public static void main(String[] args){
        int i=Math.random();//random()会自动产生一个0.0-1.0的双精度随机数
        System.out.println(i);//输出
        i=Math.random()*1000;//产生0-1000的双精度随机数  
        System.out.println(i);
       int b=(int)(Math.random()*1000);//产生0-1000的整数随机数  
        System.out.println(b);
    }
}

2.Random
类Random中的方法十分简单,它只有两个构造方法和六个普通方法。
构造方法:
(1)public Random() 
Java产生随机数需要有一个基值seed,在第一种方法中基值缺省,则将系统时间作为seed。

(2)public Random(long seed)

  相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。


普通方法:
(1)public synonronized void setSeed(long seed)  
该方法是设定基值seed。  
(2)public int nextInt()  
该方法是产生一个整型随机数。  
(3)public long nextLong()  
该方法是产生一个long型随机数。  
(4)public float nextFloat()  
该方法是产生一个Float型随机数。  
(5)public double nextDouble()  
该方法是产生一个Double型随机数。  
(6)public synchronized double nextGoussian()  
该方法是产生一个double型的Goussian随机数。
 
以下是Random类的各种例子测试:
import java.util.Random;  
 
public class RandomNumber {  
 
    public static void main(String[] args) {  
 
        // 使用java.lang.Math的random方法生成随机数 [0-1)  
        System.out.println("Math.random(): " + Math.random());  
 
        // 使用不带参数的构造方法构造java.util.Random对象 
        System.out.println("使用不带参数的构造方法构造的Random对象:");  
        Random rd1 = new Random();  
        // 产生各种类型的随机数  
        // 按均匀分布产生整数  
        System.out.println("int: " + rd1.nextInt());  
        // 按均匀分布产生长整数  
        System.out.println("long: " + rd1.nextLong());  
        // 按均匀分布产生大于等于0,小于1的float数[0, 1)  
        System.out.println("float: " + rd1.nextFloat());  
        // 按均匀分布产生[0, 1)范围的double数  
        System.out.println("double: " + rd1.nextDouble());  
        // 按正态分布产生随机数  
        System.out.println("Gaussian: " + rd1.nextGaussian());  
 
        // 生成一系列随机数  
        System.out.print("随机整数序列:");  
        for (int i = 0; i < 5; i++) {  
            System.out.print(rd1.nextInt() + " ");  
        }  
        System.out.println();  
 
        // 指定随机数产生的范围  
        System.out.print("[0,10)范围内随机整数序列: ");  
        for (int i = 0; i < 10; i++) {  
            // Random的nextInt(int n)方法返回一个[0, n)范围内的随机数  
            System.out.print(rd1.nextInt(10) + " ");  
        }  
        System.out.println();  
        System.out.print("[5,28)范围内随机整数序列: ");  
        for (int i = 0; i < 10; i++) {  
            // 因为nextInt(int n)方法的范围是从0开始的,  
            // 所以需要把区间[5,28)转换成5 + [0, 23)。  
            System.out.print(5 + rd1.nextInt(23) + " ");  
        }  
        System.out.println();  
        System.out.print("利用nextFloat()生成[0,99)范围内的随机整数序列: ");  
        for (int i = 0; i < 10; i++) {  
            System.out.print((int) (rd1.nextFloat() * 100) + " ");  
        }  
        System.out.println();  
        System.out.println();  
 
        // 使用带参数的构造方法构造Random对象  
        // 构造函数的参数是long类型,是生成随机数的种子。  
        System.out.println("使用带参数的构造方法构造的Random对象:");  
        Random ran2 = new Random(10);  
        // 对于种子相同的Random对象,生成的随机数序列是一样的。  
        System.out.println("使用种子为10的Random对象生成[0,10)内随机整数序列: ");  
        for (int i = 0; i < 10; i++) {  
            System.out.print(ran2.nextInt(10) + " ");  
        }  
        System.out.println();  
        Random ran3 = new Random(10);  
        System.out.println("使用另一个种子为10的Random对象生成[0,10)内随机整数序列: ");  
        for (int i = 0; i < 10; i++) {  
            System.out.print(ran3.nextInt(10) + " ");  
        }  
        System.out.println();  
          
    }  

ran2和ran3生成的随机数序列是一样的,如果使用两个没带参数构造函数生成的Random对象, 则不会出现这种情况,这是因为在没带参数构造函数生成的Random对象的种子缺省是当前系统时间的毫秒数。另外,直接使用Random无法避免生成重复的数字,如果需要生成不重复的随机数序列,需要借助数组和集合类



热点排行