Java-产生随机数
in Java入门小程序 with 1 comment

Java-产生随机数

in Java入门小程序 with 1 comment

这篇文章用来记录一下产生随机数的方法,这在java等编程语言中是经常要用到的。

使用Math.random()生成随机数

java自带的Math类中提供了产生随机数的方法。调用方法如下:
(int)(Math.random()*6)//产生0-5的随机数
Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机double 值,通过*来扩大一下倍数来产生你想要的范围的。
注:Math.random() -- 返回0和1之间的伪随机数 可能为0,但总是小于1,[0,1)。
所以你无法通过这样的语句来随机称成一个1-10(包含10)的数字。
(int)(Math.random()*10)
正确的做法为在后面+1;否则只能生成一个0-9之间的数字。

使用Random类生成随机数

JDK提供了一个Random类,可以更方便地生成随机数
Demo:

    import java.util.*;

public class TestRandom
{
    public static void main(String[] args) 
    {
        Random rand = new Random();
        System.out.println("rand.nextBoolean():" + rand.nextBoolean());
        byte[] buffer = new byte[16];
        rand.nextBytes(buffer);
        System.out.println(Arrays.toString(buffer));
        //生成0.0~1.0之间的伪随机double数
        System.out.println("rand.nextDouble():" + rand.nextDouble());
        //生成0.0~1.0之间的伪随机float数
        System.out.println("rand.nextFloat():" + rand.nextFloat());
        //生成平均值是 0.0,标准差是 1.0的伪高斯数
        System.out.println("rand.nextGaussian():" + rand.nextGaussian());
        //生成一个处于long整数取值范围的伪随机整数
        System.out.println("rand.nextInt():" + rand.nextInt());
        //生成0~26之间的伪随机整数
        System.out.println("rand.nextInt(26):" + rand.nextInt(26));
        //生成一个处于long整数取值范围的伪随机整数
        System.out.println("rand.nextLong():" +  rand.nextLong());
    }
}

在这里需要说明一下:计算机产生的所谓的随机数都是通过某种算法来计算出来的,因此,他可能并不是“随机”的。
而这种”算法“模型在java中被称为“种子”,正如刚才所说:相同的“种子”会产生一样的随机数。
这里有一个小测试来证明:

import java.util.Random;

public class TestSeed
{
    public static void main(String[] args)
    {
        Random r1 = new Random(50);
        System.out.println("第一个种子为50的Random对象");
        System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
        System.out.println("r1.nextInt():\t\t" + r1.nextInt());
        System.out.println("r1.nextDouble():\t" + r1.nextDouble());
        System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());
        System.out.println("---------------------------");
        
        Random r2 = new Random(50);
        System.out.println("第二个种子为50的Random对象");
        System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
        System.out.println("r2.nextInt():\t\t" + r2.nextInt());
        System.out.println("r2.nextDouble():\t" + r2.nextDouble());
        System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());
        System.out.println("---------------------------");
        
        Random r3 = new Random(100);
        System.out.println("种子为100的Random对象");
        System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());
        System.out.println("r3.nextInt():\t\t" + r3.nextInt());
        System.out.println("r3.nextDouble():\t" + r3.nextDouble());
        System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());
         System.out.println("---------------------------"); 
       
        Random r4 = new Random(System.currentTimeMillis());
        System.out.println("以当前时间为种子的Random对象");
        System.out.println("r3.nextBoolean():\t" + r4.nextBoolean());
        System.out.println("r3.nextInt():\t\t" + r4.nextInt());
        System.out.println("r3.nextDouble():\t" + r4.nextDouble());
        System.out.println("r3.nextGaussian():\t" + r4.nextGaussian()); 
    }
}

由于计算机的这种特性,为了得到“更像随机数”的随机数,我们一般以当前时间为种子。

Random ran = new Random( System.currentTimeMillis() );

手写代码来实现

前边的方法都是通过或者间接通过jdk来实现随机数的生成,这种方法则是手动来写一个随机数的数学公式。
随机数.jpg

X0就相当于“种子”,当然,尽管这是我们手写的公式,但是依旧会重复。
但是当显示过2^31-2个数之后,才可能重复。

    import java.util.Scanner;

public class AnyNumbs {
    static int  count=0,num;
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);
        System.out.print("");
        System.out.println("输入num:");
        num=in.nextInt();    
            System.out.println(Creat(1));
    }
    public static int Creat(int seed) {
        if(count==num)
        {
            return  seed;
        }
        else
            {
            count ++;
            return Creat((12*seed)%(int)(Math.pow(2, 27)-1)) ;
            }
    }
    
}

在这个例子里我们简化了c为0,通过输入一个数字来决定你想要第几个随机数。
通过简单的改造就可以生成任意数量的随机数。
一般我们不会使用这种方法。前两种就够用了。

Responses
  1. 1

    :razz: :razz:

    Reply