java Math类中的随机数

时间:2014-04-17 06:52:41

标签: java random

简单的问题

java.lang.Math.random()

这是如何工作的?意味着没有种子输入,它是否会在系统时间之外生成一个随机数?这意味着,如果在距离彼此相同的.00001s处对这个函数进行两次调用(基本上是同一时间),它会产生相同的结果吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

The javadoc解释了它的工作原理:

  

首次调用此方法时,它会创建一个新的伪随机数生成器,就像表达式

一样
new java.util.Random()
  

此新的伪随机数生成器此后用于对此方法的所有调用,并且在其他任何地方都不使用。

答案 1 :(得分:2)

返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。首次调用此方法时,它会创建一个新的伪随机数生成器,就像表达式new java.util.Random

一样

此新的伪随机数生成器此后用于对此方法的所有调用,并且在其他任何地方都不使用。此方法已正确同步,以允许多个线程正确使用。但是,如果许多线程需要以很高的速率生成伪随机数,则可以减少每个线程拥有自己的伪随机数生成器的争用。

答案 2 :(得分:1)

为了理解此代码如何运行,您必须通过各种随机数生成器算法。在实际操作中,如果你使用google" Psuedo随机数算法"那么你可以更好地了解各种概念。 回答你的问题:是的,如果随机数生成器算法基于时间(通常是),则会有所不同。 但是如果你写的那么输出

Random obj1 = new Random()
int p = obj1.nextInt(10%2)
int q = obj1.nextGaussian();

有可能同一个数字可能出现不止一次。这是因为生成的数字无疑是一个唯一的数字,但由于各种参数,所得到的输出被过滤,因此输出可能相同的概率

答案 3 :(得分:0)

生成随机(真正伪随机)数字有两种主要方法: Random类在各种范围内生成随机整数,双精度,长整数等。 静态方法Math.random在0(包括)和1(不包括)之间生成双精度数。 要生成随机整数: 不要使用Math.random(它产生双精度数,而不是整数) 使用Random类生成0到N之间的随机整数。 要生成一系列随机数作为一个单元,您需要使用单个Random对象 - 不要为每个新的随机数创建一个新的Random对象。

其他替代方案是:

SecureRandom,一个加密的随机子类 ThreadLocalRandom,用于多线程案例

import java.util.Random;

/ **生成0..99范围内的10个随机整数。 * /

public final class RandomInteger {

  public static final void main(String... aArgs){
    log("Generating 10 random integers in range 0..99.");

//注意这里重用一个Random对象

            Random randomGenerator = new Random();
    for (int idx = 1; idx <= 10; ++idx){
      int randomInt = randomGenerator.nextInt(100);
      log("Generated : " + randomInt);
    }

    log("Done.");
  }

  private static void log(String aMessage){
    System.out.println(aMessage);
  }
}