Java Random

本文详细介绍了Java中Math类的random方法,该方法用于生成介于0.0(包含)和1.0(不包含)之间的双精度浮点型伪随机数。此外,还深入探讨了java.util.Random类的nextInt方法的工作原理及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.Math.Random方法;

public static double random()

返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同

new java.util.Random

之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。
此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。
示例
实验代码:

for(int i=0;i<10;i++){
    System.out.println(Math.random());
}

编译运行结果:

0.413239827260398
0.5613588609853746
0.12305606965932625
0.306985046144161
0.9826412347633702
0.8254951913557668
0.7491019384069564
0.1593882603455361
0.29302705710082433
0.2958156615138712

java.util.Random类

public class Random

      extends 
      Object

      implements 
      Serializable

方法:
nextInt

public int nextInt(int n)

返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。 nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。 Random 类按如下方式实现 nextInt(int n) 方法:

 public int nextInt(int n) {
     if (n<=0)
        throw new IllegalArgumentException("n must be positive");

     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);

     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
     return val;
  }

前面的描述中使用了不确定的词“大致”,因为 next 方法只是一个大致上独自选择位的无偏源。如果它是一个随机选择位的最佳源,那么给出的算法应该从规定范围完全一致地选择 int 值。

该算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。

该算法特别对待 n 是 2 的次幂的情况:它从底层伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中周期较短。因此,如果 n 是 2 的次幂(幂值较小),则这种特殊情况将大大增加此方法的后续调用所返回的值序列长度。

参数:
    n - 要返回的随机数的范围。必须为正数。 
返回:
    下一个伪随机数,在此随机数生成器序列中 0(包括)和 n(不包括)之间均匀分布的 int 值。 
抛出:
    IllegalArgumentException - 如果 n 不是正数 
### Java 中 `Random` 类的使用方法 #### 创建 `Random` 对象实例 为了生成随机数,首先需要创建一个 `Random` 类的对象。这可以通过调用无参构造函数来完成。 ```java import java.util.Random; public class RandomExample { public static void main(String[] args) { // 实例化 Random 对象 Random randomGenerator = new Random(); } } ``` #### 生成不同类型的随机数值 ##### 整型随机数 (`nextInt`) 可以利用 `nextInt()` 方法获取下一个伪随机整数。如果不带参数,则返回的是整个 int 范围内的值;如果带有正整数 n 参数,则会得到 [0, n) 的均匀分布整数[^1]。 ```java // 获取介于 0 到 Integer.MAX_VALUE 之间的随机整数 int randomInt = randomGenerator.nextInt(); System.out.println("A random integer value between 0 and MAX_INT: " + randomInt); // 获取指定范围内 (比如 1 至 10) 的随机整数 int rangeMin = 1; int rangeMax = 10; int boundedRandomInt = randomGenerator.nextInt(rangeMax - rangeMin + 1) + rangeMin; System.out.println("A random integer within a specified range [" + rangeMin + ", " + rangeMax + "]: " + boundedRandomInt); ``` ##### 浮点型随机数 (`nextDouble`, `nextFloat`) 对于浮点数而言,有专门的方法用于生成双精度和单精度浮点数形式的随机数: - `nextDouble()` 返回 [0.0, 1.0) 区间内均匀分布的 double 值。 - `nextFloat()` 同样作用但是返回 float 类型的结果。 ```java double randomDouble = randomGenerator.nextDouble(); float randomFloat = randomGenerator.nextFloat(); System.out.println("A random double precision floating-point number: " + randomDouble); System.out.println("A random single precision floating-point number: " + randomFloat); ``` #### 随机布尔值 (`nextBoolean`) 有时也需要模拟抛硬币的情况,这时就可以借助 `nextBoolean()` 来实现真/假两种状态之一的概率事件发生。 ```java boolean coinTossResult = randomGenerator.nextBoolean(); if (coinTossResult) { System.out.println("The result was heads."); } else { System.out.println("The result was tails."); } ``` #### 设置种子 (`setSeed`) 通过设置相同的种子可以让每次运行程序时都获得相同序列的“随机”数,这对于调试非常有用。 ```java long seedValue = 42L; // 可以是任意 long 类型常量 randomGenerator.setSeed(seedValue); for (int i = 0; i < 5; ++i) { System.out.print(randomGenerator.nextInt(100) + " "); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值