java生成指定范围内的随机数

我们经常说Java中的随机数是伪随机数,那么我们要知道什么是伪随机数。

什么是伪随机数?

  1、真正意义上的随机数在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。这才是真随机。

  2、计算机中的随机函数是按照确定算法模拟产生的,其结果是确定的,是可见的,我们可以这样认为这个可预见的结果其出现的概率是100%,所以被称为伪随机。

Java随机数产生原理

     Java的随机数产生用了线性同余公式等,也就是说通过一个复杂的算法生成的。如果感兴趣,可以去看一下这篇对java随机数源码解析的博客。http://www.codes51.com/article/detail_1581162_5.html

Java产生随机数的方法有两种:

  1、Math.random()
  2、new Random()

java.lang.Math.Random

  Math.Random()函数能够返回0-1之间的double值,在该范围内(近似)均匀分布。

java.util.Random:

Random()有两种构造方法:

     1、Random():使用一个和当前时间的毫秒数作为种子,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。下面是JDK的源代码。


  public Random() { this(System.currentTimeMillis()); }。

   2、 Random(long seed):直接传入一个种子,如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

 random对象的nextInt(),nextInt(int n)方法:
  int nextInt() 
      返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 
  int nextInt(int n) 
      返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 [0,1) 之间均匀分布的 int值。

下面是带种子不带种子两种构造方法生成[1,100]的随机数的代码:

 1 //生成[1,100]的随机数
 2 class random_test{
 3     public static void main(String[] args){
 4         Random r = new Random();    
 5         System.out.println("不带种子:");
 6         for(int i = 1; i <= 10; i++){
 7             System.out.print(r.nextInt(100)+1+" ");
 8         }
 9         System.out.println();
10 
11         System.out.println("带种子:");
12         r = new Random(100);
13         for(int i = 1; i <= 10; i++){
14             System.out.print(r.nextInt(100)+1+" ");
15         }
16         System.out.println();
17     }
18 }

以下是运行两次的结果,结果很清晰,带种子的生成的结果是相同的:

由于nextInt(100)是生成 [0,100) 的随机数,但我们要生成 [1,100] 的,所以nextInt(100)+1;

要生成[22,99]的随机数,则nextInt(78)+22。

原文地址:https://www.cnblogs.com/Xycdada/p/7569103.html