Random伪随机数

Random类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改(请参阅 Donald Knuth 的The Art of Computer Programming, Volume 3,第 3.2.1 节)。

如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证此属性的实现,为类 Random 指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。

Random 类实现的算法使用一个 protected 实用工具方法,每次调用它最多可提供 32 个伪随机生成的位。 


如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列

当我们设置了种子数为2时,生成的随机数

 public static void rundom() {
        Random a = new Random();
        a.setSeed(2);
        int i = 5;
        while (i >0) {
            print(9, a.nextInt(100));
            i--;
        }
    }

将会始终是

[9],8

[9],72

[9],40
[9],67
[9],89
<think> 我们正在讨论Python的random模块,它用于生成伪随机数。用户要求了解random伪随机数生成函数的介绍。根据引用,我们可以总结以下要点: 1. random模块是Python标准库的一部分,用于生成伪随机数。 2. 它基于Mersenne Twister算法,该算法生成53位精度的浮点数,周期非常长(2^19937-1)。 3. 虽然是伪随机数(即确定性算法生成),但经过广泛测试,适合大多数非加密用途。 4. 基本函数是random(),生成[0.0, 1.0)范围内的均匀分布浮点数。 我们将介绍random模块的常用函数,并注意以下几点: - 使用中文 - 数学公式用$...$或$$...$$ - 在适当的地方添加引用标记 以下是回答的结构: 1. 引入:解释什么是伪随机数,以及random模块的作用。 2. 核心函数:介绍random()函数和其他重要函数(如生成整数、序列操作、实值分布等)。 3. 注意点:强调其伪随机性和不适用于加密。 4. 示例代码:展示几个常用函数的用法。 5. 总结:使用场景和替代方案(如numpy.random)。 同时,根据引用[2],我们还可以提到numpy.random作为补充。 最后,生成相关问题。 </think> ### Python `random` 模块:伪随机数生成详解 `random` 模块是 Python 标准库中用于生成**伪随机数**的核心工具。以下是关键解析: --- #### 1. 伪随机数本质 - **确定性算法**:通过固定算法(Mersenne Twister)根据**随机种子**($\text{seed}$)迭代生成序列 - **周期特性**:周期为 $2^{19937}-1$(约 $10^{6000}$ 量级),之后序列会重复[^3] - **非加密安全**:完全可预测,不适用于密码学场景[^3] #### 2. 核心生成器 ```python import random # 初始化种子 (默认为系统时间) random.seed(42) # 基础生成函数 [0.0, 1.0) rand_float = random.random() # 例: 0.639426... ``` - 生成 $[0.0, 1.0)$ 间的 53 位精度浮点数[^3] - 底层使用**梅森旋转算法**(Mersenne Twister),速度快且线程安全 --- #### 3. 常用函数分类 ##### ① 整数生成 | 函数 | 数学表达 | 示例 | |--------------------------|----------------------------|--------------------------| | `randint(a, b)` | $X \sim U[a,b]$ | `random.randint(1,6)` → 3 | | `randrange(start, stop, step)` | $X \in \{s,s+st,s+2st,...\}$ | `random.randrange(0,10,2)` → 4 | ##### ② 序列操作 ```python colors = ['red','green','blue'] random.shuffle(colors) # 原地洗牌 → ['blue','red','green'] random.choice(colors) # 随机选取 → 'red' random.sample(colors,2) # 无放回抽样 → ['green','blue'] ``` ##### ③ 实值分布 | 分布类型 | 函数 | 概率密度函数 | |------------|---------------------|----------------------------------| | 均匀分布 | `uniform(a, b)` | $f(x)=\frac{1}{b-a}\ (a\leq x\leq b)$ | | 高斯分布 | `gauss(mu, sigma)` | $f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}$ | | 指数分布 | `expovariate(lambda)` | $f(x)=\lambda e^{-\lambda x}$ | --- #### 4. 关键特性 1. **种子控制** 相同种子产生相同序列: ```python random.seed(100) a = random.random() # 始终为 0.145669... ``` 2. **性能局限** 单次仅生成一个值,需循环生成数组 → 推荐 `numpy.random` 批量生成[^2] 3. **应用场景** ✅ 蒙特卡洛模拟 ✅ 游戏随机事件 ✅ 机器学习数据打乱 ❌ 加密/安全相关 --- #### 5. 基础使用示例 ```python # 模拟骰子投掷 dice = random.randint(1, 6) # 生成正态分布样本 mu, sigma = 0, 0.1 sample = random.gauss(mu, sigma) # 从列表加权抽样 fruits = ['apple','orange','banana'] weights = [0.3, 0.2, 0.5] choice = random.choices(fruits, weights, k=10) ``` > **扩展阅读**:对加密场景应使用 `secrets` 模块;科学计算优先选 `numpy.random`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值