Skip to content

Latest commit

 

History

History
63 lines (44 loc) · 2.09 KB

伪随机数.md

File metadata and controls

63 lines (44 loc) · 2.09 KB

伪随机数

python标准库中存在一个random库的函数,为啥要拿出来单独说,之前接触python的时候比较喜欢用这个生成随机数,后来发现随机数是算法随机数。是由一个一个随机数种子通过算法迭代产生。而种子seed,在没有设定的情况下默认使用计算机的源时间。

官方的建议是不使用random生成的随机数来处理安全加密目的等随机值,只用来生成模型和随机抽样。

random.random()随机生成一个0到1之前的浮点数。

random.randint(1,10)随机生成一个1到10之间的整数。

其中几乎所有的随机数生成模块都基于random()方法,都在此方法上进行一定的计算来得到自己的主要结果。比如randint(a, b)a+(b-a)*random()的浮点数取舍。

当设定随机数种子:

>>> random.seed(10)
>>> random.random()
0.5714025946899135

>>> random.seed(10)
>>> random.random()
0.5714025946899135

如上,当设定相同的种子的时候,生成的随机数是相同的,并且在设定种子后,多次调用的随机数即便不相同,也都保持顺序一致不变。

>>> random.seed(1592308800)
>>> random.random()
0.13341011083473608
>>> random.random()
0.07062759073158065
>>> random.random()
0.049745450774624334

>>> random.seed(1592308800)
>>> random.random()
0.13341011083473608
>>> random.random()
0.07062759073158065
>>> random.random()
0.049745450774624334

所以当可以获取到种子的范围或者是值的时候,就可以预估出随机数的范围或者值。也就是保证种子的真随机数才可以使用随机数。

可以使用系统函数 os.urandom()从操作系统提供的源生成随机数来作为种子,或者使用官方提供的一个安全模块生成随机数,python3.6中的新模块secrets

secrets.token_hex(32)  #返回一个32字节的十六进制字符串
random.Systemrandom   #使用系统的随机模块

例如一个随机抽盖楼奖

def ipad():
    """抽奖"""
    ipad = secrets.choice(list(range(1,101)))     #这个随机数会随机选取一个整数