关于Random(47)与randon.nextInt(100)的区别

本文深入探讨Java中Random类的伪随机数生成机制,解释了种子与随机数范围的关系,以及如何利用Random类在指定范围内生成随机数。通过实例代码演示了随机种子对结果的影响,包括单个对象、多个对象及对象连续调用时的随机数生成特性。

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

Java中Random也称为伪随机函数。

这句代码在Thinking in java中很常见 
Java代码 
  1. Random rand new Random(47);  

但是下面两句代码放在一起就会有点晕了 
Java代码 
  1. Random rand new Random(47);  
  2. int rand.nextInt(100);  

生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。 
下面Random()方法做一些简单说明吧。 

伪随机数 
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。 
一般地,我们使用同系统时间有关的参数作为随机种子。 

Random对象的生成 
Random类包含两个构造方法,下面依次进行介绍: 
(1)public Random() 
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。 
Java代码 
  1. public Random() this(++seedUniquifier System.nanoTime());  
  2. private static volatile long seedUniquifier 8682522807148012L;  

(2)public Random(long seed) 
该构造方法可以通过制定一个种子数进行创建。 
Java代码 
  1. Random new Random(10);  

切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关! 

随机种子对结果的影响 
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定 
选取随机种子为47,随机数最大值为20. 
下面代码运行10次的结果总是为18. 
Java代码 
  1. public static void main(String[] args)  
  2.         for (int 010i++)  
  3.             Random rand new Random(47);  
  4.             int rand.nextInt(20);  
  5.             System.out.println(j);  
  6.          
  7.      

(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定 
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18 
Java代码 
  1. public static void main(String[] args)  
  2.         for (int 010i++)  
  3.             Random rand1 new Random(47);  
  4.             Random rand2 new Random(47);  
  5.             int rand1.nextInt(20);  
  6.             int rand2.nextInt(20);  
  7.             System.out.println(j);  
  8.             System.out.println(k);  
  9.          
  10.      

(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同 
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13. 
但每次循环的结果都一样,18,15,13会被顺序循环输出。 
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。 
Java代码 
  1. public static void main(String[] args)  
  2.        for (int 010i++)  
  3.            Random rand new Random(47);  
  4.            int rand.nextInt(20);  
  5.            int rand.nextInt(20);  
  6.            int rand.nextInt(20);  
  7.            System.out.println(j);  
  8.            System.out.println(k);  
  9.            System.out.println(p);  
  10.         
  11.     

产生特定区间的随机值

如产生5-26之间的随机值,为rand.nextInt(26-5+1)+5;

总结 
最后结合API中的说明,再简要总结写Random()方法的功能: 
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字; 
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的; 
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;

  (4) 47是一个产生随机数的魔法数字,这个问题到现在都没人能够解释,只是经过很多次试验得到的,包括《Thinking in java》的作者布鲁斯.艾克尔也这么提到:由47做种后,产生的随机数更加体现了随机性。它没有什么具体的意义,只要理解随机数如果有一个种子,哪么出现了比较随即的随机数,而当种子是47的时候,随即率是最大的。

### 关于 `np.random.random` 的详细介绍 #### 函数定义 `np.random.random` 是 NumPy 库中用于生成 `[0.0, 1.0)` 范围内的均匀分布随机浮点数的函数。它返回一个或一组随机数,具体取决于传入的参数。 #### 参数说明 该函数接受一个可选参数 `size`,表示输出数组的形状。如果未提供此参数,则默认返回单个浮点数值。 - **`size`**: 定义输出数组的形状。可以是一个整数或者元组形式。如果不传递任何值,默认为 None,此时会返回单一的随机浮点数[^5]。 #### 返回值 返回的是一个 ndarray 或者单独的 float 值,其数据类型为 `float64`。 #### 使用示例 以下是几个常见的使用案例: ```python import numpy as np # 单个随机数 single_random_value = np.random.random() print(single_random_value) # 随机数组 (一维) random_array_1d = np.random.random(size=5) print(random_array_1d) # 随机二维数组 random_array_2d = np.random.random((3, 4)) print(random_array_2d) ``` 以上代码分别展示了如何生成单个随机数、一维随机数组以及二维随机数组的情况。 #### 特殊用途 当需要生成更大范围或其他类型的随机数时,可以通过简单的算术运算扩展 `np.random.random()` 的结果。例如,要生成 `[a, b)` 范围内的随机数,可以用如下方法实现: \[ \text{rand\_num} = a + (\text{b-a}) * \text{np.random.random()} \] 下面给出具体的例子来展示这一过程: ```python low = 5 high = 10 custom_range_randoms = low + (high - low) * np.random.random(10) print(custom_range_randoms) ``` 这里通过调整比例因子 `(high-low)` 和偏移量 `low` 来改变原始 `[0,1)` 区间到目标区间 `[5,10)` 上去[^6]。 #### 性能考量 由于基于底层优化过的 C 实现,因此即使对于大规模矩阵操作而言也具有相当高的效率表现。不过需要注意的是,在某些特殊情况下可能还需要考虑种子设定等问题以便重复实验结果一致性需求得到满足。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值