Python随机数天生模块教程演示如何在Python中天生伪随机数。
文章目录1 先容1.1 随机数字天生器1.2 Python random 模块1.3随机种子2 利用2.1 Python random模块同一随机种子利用2.2 Python random.randint2.3 Python random.randrange2.4 Python random.uniform2.5 Python random.choice2.6 Python random.shuffle2.7 Python random.sample2.8 Python secrets 模块2.9 Python UUID模块3 参考1 先容1.1 随机数字天生器随机数天生器(RNG)天生一组在外不雅观上不显示任何可区分模式的值。随机数天生器分为两类:硬件随机数天生器和伪随机数天生器。硬件随机数天生器被认为能产生真正的随机数。伪随机数天生器根据软件算法天生值。它们产生的值看起来是随机的。但这些值是确定性的,如果算法已知,可以重新天生。
在打算中,随机天生器用于游戏、仿照或密码学。为了安全起见,必须利用加密安全的伪随机数天生器。为了提高伪随机数天生器的质量,操作系统利用从设备驱动程序、用户输入延迟或来自一个或多个硬件组件的抖动中网络的环境噪声。这是加密安全伪随机数天生器的核心。

内置的Python random模块为各种分布实现伪随机数天生器。Python利用Mersenne Twister算法来天生伪随机数。这个模块安全性不高。对付安全干系的任务,推举利用secrets模块。
1.3随机种子种子是初始化随机数天生器的值。随机数天生器通过对以前的值实行一些操作来天生值。当算法开始时,种子是天生器操作的初始值。天生器最主要和最困难的部分是供应靠近真正随机数的种子。要把稳的是同一种子产生相同的伪随机数集。
2 利用2.1 Python random模块同一随机种子利用不才面的示例中,我们利用相同的种子。相同的种子值产生相同的伪随机值。
import randommyseed = 16# 设置随机种子random.seed(myseed)# 产生随机数print(random.random())print(random.random())print(random.random())print('')random.seed(myseed)print(random.random())print(random.random())print(random.random())
0.361522774914075140.4804806656012940.41695262660566480.361522774914075140.4804806656012940.4169526266056648
2.2 Python random.randint
random.randint函数在值[x,y]之间天生整数。以下示例天生数字1到10之间的四个随机整数。
import randomval = random.randint(1, 10)print(val)val = random.randint(1, 10)print(val)val = random.randint(1, 10)print(val)val = random.randint(1, 10)print(val)
56310
2.3 Python random.randrange
random.randrange函数打消了右边的区间。它选择[x,y)之间的值。以下示例天生数字1到10之间的四个随机整数,个中打消了值10。
import randomval = random.randrange(1, 10)print(val)val = random.randrange(1, 10)print(val)val = random.randrange(1, 10)print(val)val = random.randrange(1, 10)print(val)
5145
2.4 Python random.uniform
random.uniform函数在值[x,y]之间天生随机浮点数。以下示例在数字1和10之间产生四个随机浮点数。
import randomval = random.uniform(1, 10)print(val)val = random.uniform(1, 10)print(val)val = random.uniform(1, 10)print(val)val = random.uniform(1, 10)print(val)
1.18335955621202472.38563841781565026.454433009078886.678603948997886
2.5 Python random.choice
该random.choice函数从非空序列返回一个随机元素。该示例从列表中随机抽取一个单词四次。
import randomwords = ['sky', 'storm', 'rock', 'falcon', 'forest']val = random.choice(words)print(val)val = random.choice(words)print(val)val = random.choice(words)print(val)val = random.choice(words)print(val)
falconfalconforestrock
2.6 Python random.shuffle
random.shuffle函数可以将序列打乱。以下示例将单词列表随机打乱两次。
import randomwords = ['sky', 'storm', 'rock', 'falcon', 'forest']random.shuffle(words)print(words)random.shuffle(words)print(words)
['sky', 'falcon', 'forest', 'rock', 'storm']['storm', 'forest', 'falcon', 'sky', 'rock']
2.7 Python random.sample
random.sample许可从一个序列中随机抽取n个唯一元素。以下示例从单词列表中两次随机抽取三个元素。
import randomwords = ['sky', 'storm', 'rock', 'falcon', 'forest']sample = random.sample(words, 3)print(sample)sample = random.sample(words, 3)print(sample)
['storm', 'rock', 'forest']['rock', 'falcon', 'storm']
2.8 Python secrets 模块
secrets模块用于天生适宜管理密码、帐户身份验证或安全令牌等数据的强随机数。sercets模块中token_hex函数返回一个随机的十六进制文本字符串。token_urlsafe函数返回一个url安全的随机文本字符串。
import secretsimport string# 返回一个随机的十六进制文本字符串print(secrets.token_hex(12))# 返回随机文本字符串print(secrets.token_urlsafe(12))# 天生一个八个字符的字母数字密码alphabet = string.ascii_letters + string.digitspassword = ''.join(secrets.choice(alphabet) for i in range(8))print(password)
49a4c25d535581c0e1edaf71_FHy1al7lB4fyVqUJjLoiy7k
2.9 Python UUID模块
通用唯一标识符(Universally Unique Identifier)UUID是指一台机器上天生的数字,UUID是128位的全局唯一标志,常日由32字节的字符串表示。UUID由以下几部分组成:
韶光戳uuid1():根据韶光或时钟序列天生字符串分布式打算uuid2():根据分布式打算环境DCE天生字符串机器识别号uuid3():根据MAC地址或者IP天生字符串,没有网卡则通过其他办法天生。随机数uuid4():自动随机天生一组序列字符串散列值uuid5(): 基于名字和SAHI值python中uuid模块供应UUID类,UUID类中通过函数uuid1(), uuid3(), uuid4(), uuid5()来天生1, 3, 4, 5各个版本的UUID ( python中没有uuid2()这个函数,但是UUID标识符中有该指示实现,缘故原由uuid2和uuid1类似,以是uuid2极少利用)。
import uuidname = "test"print(uuid.uuid1())print(uuid.uuid3(uuid.NAMESPACE_DNS, name))print(uuid.uuid4())print(uuid.uuid5(uuid.NAMESPACE_DNS, name))
62ecaf30-b61a-11ea-ac5b-0a58ac13091e45a113ac-c7f2-30b0-90a5-a399ab912716109e9212-e837-4cd9-9e21-3b48aba373fa4be0643f-1d98-573b-97cd-ca98a65347dd
uuid1可担保天生环球范围的唯一性字符. 但通过该方法天生的字符中包含有主机的网络地址, 可能危及隐私,根据实验的结果,产生的UUID后面几段的数字会完备一样。uuid4利用随机数来天生UUID但是伪随机数有较低的重复概率。uuid3和uuid5类似,都是通过打算命名空间和名字的SHA-1散列值来天生UUID。
在实际利用uuid1和uuid4较多,uuid3和uuid5更适宜唯一性更高的场合。
3 参考http://zetcode.com/python/random-module/
https://www.jianshu.com/p/f99737713c1b