python随机数(转载)

随机生成 0 到 1 之间的浮点数

random.random() 方法会返回 [0.0, 1.0) 之间的浮点数,注意,这是一个左闭右开的区间,随机数可能会是 0 但不可能为 1 。

 

随机生成 a 与 b 之间的整数

使用 random.randint(a , b) 方法,你可以生成一个 a 与 b 之间的随机整数,也就是 [a, b] 。

 

当然,如果你想要生成的随机整数不会包含 b ,也即 [a, b) , 你可以使用 random.randrange() 方法。

 

生成 a 与 b 之间的浮点数

如果你需要生成 [a, b] 之间的随机浮点数,那么 random.uniform(a, b) 会满足你的需求。

 

从列表中随机取出一个元素

如果你想从序列类型中随机取出一个元素,比如列表、元祖、字符串等,random.choice() 是一个不错的选择。

 

 

需要注意的是,该方法需要参数非空,不然会抛出 IndexError 的错误。

 

打乱列表中元素的顺序

使用 random.shuffle(items) 方法可以帮你把序列 items 中的元素随机打乱。

 

 

如果你不想修改原来的列表,你可以使用 copy 模块先拷贝一份原来的列表

 

 

从列表中随机取出 n 个元素

使用 random.sample(items, n) 方法可以从序列 items 中随机取出 n 个元素。

 

生成密码学安全的伪随机数

 

什么是密码学安全的伪随机数,请看维基百科( http://dwz.cn/7JhRN5 )。不过暂时不需要深入的话,理解为比普通随机数更随机的技术就好。

如果你需要生成密码学安全的随机数,你可以通过 random.SystemRandom 类实现。random.SystemRandom 实例化后的对象拥有与 random 类似的方法。

 

如果 Python 版本在 3.6 及以上,可以使用 secrets 模块

通过 secrets 模块,同样也能生成密码学安全的随机数。并且,利用它生成一些特定的秘钥特别方便。

下面是一些简单的例子

 

 

通过这个模块比较字符串相等,还可以减少被时序攻击的风险。

 

什么是时序攻击呢,我这找了一个通俗的解释

举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。

(文字来源知乎,侵删)

关于secrets 模块的更多介绍,请看官方文档( https://docs.python.org/3/library/secrets.html )

 

转载自:http://baijiahao.baidu.com/s?id=1596465591200328534&wfr=spider&for=pc

 

posted @ 2019-04-16 16:30  林丶  阅读(736)  评论(0编辑  收藏  举报