Python random(伪随机数)完全解析
random作为Python标准库中的最常用的标准库之一,今天我们就深入的了解一下。
基础操作
1 |
|
random的两种使用方式
通常我们再查找资料的时候看到的random调用方式 大多有两种。
到底哪一种是正确,或者是错误的呢。
1 |
|
来解释一下这种调用方式:首先引入random包,然后从random文件中引入Random类,然后继续调用类的random方法,有种套娃的感觉。
import random
random.random()
看完上面的解释再看这种写法是不是很容易就一脸懵逼,我的类呢?你这方法从哪里来的不科学啊。
别怕,源码之中无秘密
# 注释给了很好的解释
# Create one instance, seeded from current time, and export its methods
# as module-level functions. The functions share state across all uses
#(both in the user's code and in the Python libraries), but that's fine
# for most programs and is easier for the casual user than making them
# instantiate their own Random() instance.
_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
triangular = _inst.triangular
randint = _inst.randint
choice = _inst.choice
randrange = _inst.randrange
sample = _inst.sample
shuffle = _inst.shuffle
choices = _inst.choices
normalvariate = _inst.normalvariate
lognormvariate = _inst.lognormvariate
expovariate = _inst.expovariate
vonmisesvariate = _inst.vonmisesvariate
gammavariate = _inst.gammavariate
gauss = _inst.gauss
betavariate = _inst.betavariate
paretovariate = _inst.paretovariate
weibullvariate = _inst.weibullvariate
getstate = _inst.getstate
setstate = _inst.setstate
getrandbits = _inst.getrandbits
可以看到在random.py的模块最后已经帮我们完成一次类的实例化。而且可供调用的方法也全部包含。
random是否线程安全
The random() method is implemented in C, executes in a single Python step, and is, therefore, threadsafe.
这是一个底层C实现的算法,是线程安全的
如何实现伪随机数
通过官方文档我们查询到random算法使用的是Mersenne Twister
1 |
|
Random继承了c模块的random方法
1 |
|
以getrandbits方法为例
Generates an int with k random bits. 生成有K个bits的整形随机数
1 |
|
1 |
|
“世界就像是个巨大的马戏团,它让你兴奋,却让我惶恐,因为我知道散场后永远是有限温存,无限心酸。”——Charlie Chaplin