python输入随机数值,Python中随机函数
Yyds干货库存
引入生成随机值的能力是一项重要的编程技能。即使你每天都不需要它们,随机值仍然会出现在数量惊人的地方。当然,对于许多人来说,当他们想到随机值时,首先想到的是与游戏相关的用例,如洗牌、掷骰子和老虎机。
然而,随机值还有许多其他用途。其中包括:
生成安全密码或密码重置URL。为测试用例或代码演示创建样本数据。清理个人身份信息(PII)数据,为分析准备数据。像许多其他重要的编程任务一样,Python编程语言具有设计良好且一致的支持,可以生成随机值作为Python标准库的一部分。一些相关的模块包括随机模块,秘密模块和uuid模块。Secrets模块提供加密性强的随机数,random模块提供安全性差的数,可用于游戏、测试数据、仿真等。这两种类型的随机值之间的差异将在下面讨论。
随机值和伪随机数的主要区别“真”随机数和伪随机数:伪随机数发生器使用一种算法来生成一个看似随机但的确定性的数列。事实上,他们是如此确定,给定相同的种子值(或起始值),他们将可靠地生成相同的数列!另一方面,随机数生成器依靠物理过程来创建真正的随机数。
虽然伪随机数发生器适用于许多用途,但它们不适用于需要真正随机性的应用,如密码学。这是因为知道算法的人可以预测序列中的下一个数字。因此,实数随机数发生器对于安全关键应用非常重要。
和随机加密正如我们在上一节中讨论的,如果我们正在编写游戏或模拟数据,随机模块是很好的。然而,如果我们处理授权令牌或其他安全数据,我们需要secrets模块。
随机模块这两个模块还有其他区别。random模块是两个模块中较老的一个,从Python版本1开始就存在了。它有一个很大的函数接口,本质上是共享实例random的包装器。一个类的随机。但是,您总是可以构造自己的随机类并使用它。随机的。Random可以用一个已知的种子实例化一个随机类,以给出一个可重现的随机数序列。如果缺少,将使用基于系统计时器的种子值。
这个例子显示了随机选择种子的效果。随机类别:
创建随机整数演示
从随机导入随机的
种子=42
seeded_1=随机(种子)
seeded_2=随机(种子)
randomly _ seeded=Random()
#获取1到1000之间的随机数,包括1和1000
print(seeded_1.randint(1,1000))
print(seeded_2.randint(1,1000))
print(random _ seeded . randint(1,1000))
#使用功能界面
print(randint(1,1000))655
655
161
96随机类的两个实例用相同的种子实例化,生成输入的前两行。每次运行程序时,这些行将打印655行。(试试看!)。
最后两行是使用随机种子实例和函数接口(也是随机种子)创建的。每次运行时代码都会发生变化。在这两条线的情况下,任何数字排列的游程都是完全重合的。
加密模块乍一看,最早在PEP 506中描述,最早出现在Python 3.6中的secrets模块,看起来和Python random模块有很大的不同。很多函数接口包装器都消失了,所以,比如你不能直接导入randint。此外,还有秘密。SystemRandom类,它将忽略您可能传递给它的任何种子值。
然而,如果我们在下面描述这些表面上的区别,这两个类是非常相似的。实际上,从源代码来看:
秘密。SystemRandom类实际上是Random的别名。SystemRandom类。随机的。SystemRandom是Random的子类。因此,一般来说,在一个系统中可用的功能在另一个系统中也是可用的。(两个例外是getstate和setstate,它们不是在SystemRandom中实现的)。最显著的内部区别是SystemRandom中的核心“随机化”行为是根据os.urandom实现的反过来,urandom函数传递一个整数,并使用一个平台相关的加密强随机值生成器返回许多随机字节。
现在我们知道我们可以使用这两个类中的任何一个。它们基本上是可以互换的,但是其中的秘密。SystemRandom会更真实的随机,所以在更安全的环境下使用。
记住这一点,接下来让我们看一些用例。
生成随机数
Randint和Randrange我们已经学习了如何使用Randint生成特定范围内的随机数。RAND函数非常类似,只是它不包含上限,而randrange的上限包含上限。如果您足够频繁地运行这段代码,第一行输出将显示5,但第二行不会。
从机密导入系统随机
rand=SystemRandom()
# 1到5之间的整数,包括1和5
print(rand.randint(1,5))
# 1到5之间的整数,但不包括5
print(rand.randrange(1,5))
生成随机分布Random和SystemRandom分享几种可以让你根据各种分布生成随机值的方法。其中包括均匀分布(获得两个端点之间的浮点值,类似于randint提供的)、高斯(正态)分布等。
例如,我们可以创建一个包含20个虚拟智商值的列表,这些值沿着与真实人口相同的正态曲线随机分布。根据定义,平均智商为100,标准差为15。(顺便说一句,出于这个例子的目的,我们想要对这个分布进行建模,即使我们忽略了对这个想法的合理批评以及我们如何测试它。)
下面是随机创建20个智商“组”的代码:
智商分布
从机密导入系统随机
rand=SystemRandom()
population=[round(rand . gauss(100,15)) for _ in range(0,20)]
打印(人口)当然,输出会有所不同。这是一个典型的操作:
[102, 90, 88, 82, 102, 93, 127, 121, 94, 107, 103, 80, 106, 106, 84, 107, 108, 88, 123, 121]
在Python中用其他语言进行随机选择,通常需要两步从列表或其他序列中进行选择。首先,你得到一个从0到列表上限的随机数(长度减1)。然后将索引应用于列表以选择元素。在Python中,choice和chchoices这两个方法使您能够同时执行这两个步骤。这使得从任何类型的序列中选择所需大小的随机样本变得非常容易。
例如,给定上面的代码,假设我们想要获得IQ的总体,并从中选择一个或多个值。下面是我们如何快速做到这一点:
#随机选择一个智商
print(rand.choice(人口))
#随机选择四个智商
Print (rand.choices (population,k=4))输出(示例):
102
[107,102,88,103]
如何使用Python生成随机字符串因为在Python中使用随机方法很容易从序列中选择随机选项。通过Random.choice或Random.choices函数在Python中创建随机字符串也非常简单。另外,secrets模块定义了一些特殊的功能,也可以根据你的需求来使用。
让我们先来看一个可以用来生成多种类型字符串的通用方法。该模块包括几个基本上是硬编码字符序列的字符串,如ascii_lowercase (a-z)、ascii_uppercase (A-Z)、ascii_letters、标点符号和数字。可以调用Random.choices或SystemRandom.choices来创建具有所需长度的数组,然后可以使用str类的join方法将该数组转换为新的字符串。
我们在下面的示例中结合了这些步骤:
从字符串导入ascii _字母,数字,标点,ascii _小写,ascii _大写
从机密导入系统随机
rand=SystemRandom()
四位数=“”。join(rand.choices(数字,k=4))
ten_mixed_case=“”。join(rand . choices(ascii _ letters,k=10))
什锦=ascii _字母标点
twenty _ hashed=“”。join(rand.choices(什锦,k=20))
打印(四位数)
打印(十个混合案例)
打印(twenty _ asserted)代码输出:
8782
PLZYOxFLoQ
!mNsKsF([I#F(c JcG}
使用secrets模块加密随机字符串除了如上所示轻松创建随机字符串之外,Secrets模块还提供了几个函数,可用于生成各种格式的随机字节序列。在最底层,我们可以使用token_bytes函数来生成不同长度的原始“字节”数组。
从机密导入令牌_字节
b=令牌字节(10)
打印(类型(b))
打印(b)代码输出:
类字节
b!\ x05p \ xc6a \ x87 \ xf9 ~ (\ x9 原始字节作为加密算法或类似算法的输入可能是有用的,但请记住,它们不会包含有效的UTF-8码位,因此您不应使用此函数来生成字符串。要获得一个字符串,您可以使用上一节中的技术或以下两个函数之一。
我们可以返回一个字符串,它不是得到原始格式的字节,而是以十六进制格式再次由随机字节组成。这为每个字节提供了两个十六进制输出字符:
从机密导入令牌_十六进制
token=token_hex(10)
print(f 返回长度为{len(token)}:)的{type(token)}
打印(令牌)代码输出:
返回了一个长度为:20的类‘str’:同系列的第三个函数,——,在某些方面可能是最有用的,是token_urlsafe。这个函数允许我们将随机字节字符串转换成稍加修改的base64编码字符串。这里,每个字节平均生成1.3个字符,结果可以安全地用作URL——例如,缩短的URL或密码重置标记。另一个优点是该字符串来自一个比16位token_hex更大的潜在随机字符集。
从机密导入令牌_urlsafe
token=token_urlsafe(15)
打印(令牌)代码输出:
gfN2nGjO7izMPyXs5tvU
使用UUID:在Python中生成随机值和唯一值虽然我们在本文中关注的是随机值,但我们现在想花一些时间来讨论随机值和唯一值的所有实际用途。解决这个问题的一个非常常见的方法是通用唯一标识符(UUID)的概念。UUID是一个128位的数字,不能100%保证是唯一的,但在统计上很可能是唯一的,所以发生冲突的几率很小。
除了大数字之外,UUID还共享一种通用的表示格式。一个28位的数可以表示为32个十六进制数,而UUID加4个连字符组成一个36个字符的字符串,排列模式为8-4-4-6-12。例如:
967909 E3-7231-4040-aae 4-8 b 6 FB 96 a0b Python模块uuid有几个不同的函数,对应很多公认的算法,用来创建这样的标识符,但是推荐使用两个最常见的类型之一,uuid1和uuid4。
UUU1值是通过将网络节点id(通常指网卡的mac地址)与少量关于UUID版本和变体的信息以及表示高分辨率时间戳的许多位相结合而创建的。
相反,uuid4值通常包含6位用于存储版本和变量信息,以及122位纯随机数据。因此,根据维基百科的说法,虽然原则上两个uuid4的值可能存在冲突,但实际上,“在4个uuid的103万亿个版本中找到重复的概率是十亿分之一。”。
通过使用Python uuid模块,可以很容易地创建uuid1和uuid4值。正如我们将看到的,字符串表示看起来是一样的,尽管描述uuid1字段中的位更有意义。
从uuid导入uuid1、uuid4
print(uuid1())
Print(uuid4())代码输出:
bfc 89 f3e-e6ab-11ec-abfc-4a 9b 744d 17 b 8
05586 C2-50ED-41 a6-AE31-BF 96 b 9d 79 df 2和本文中的大部分内容一样,当我们说“样本输出”时,它实际上只是他的一个代码运行的结果。当然,至少在uuid4的情况下,如果你运行这个代码103万亿次,你有十亿分之一的机会得到和我一样的结果。
在结束对UUID的讨论之前,我们在这里提到它们,因为它们是一个被广泛接受的标准,但正如我们所看到的,uuid4的实现和系统模块中的许多实用功能之间有很多重叠。例如,我经常看到uuid4函数用于在数据库中生成主键,尤其是在NoSQL的上下文中,那里可能不支持字段的自动递增。原则上,人们也可以使用secrets.token_hex来完成相同的任务,但uuid4可能会使代码的意图更加清晰。
总结我希望你喜欢我们的Python随机模块之旅。记住,我们已经在这里讨论了核心Python标准库中的可用内容。在数据科学领域,我们还应该熟悉NumPy的模块numpy.random,它提供了根据许多不同的分布生成样本的能力。在功能上与我们上面讨论的核心库中的分布方法有一些重叠,但是在NumPy的情况下,您可以更有效地生成大量的样本数据。
哦,还有最后一件事,3354。附上生成随机数分布图和代码实现:
随机导入
将matplotlib.pyplot作为plt导入
x=[对于范围(100)中的n,random.randint(1,100)]
y=[对于范围(100)中的n,random.randint(1,100)]
plt.figure(figsize=(8,6),dpi=80)
平面散点图(x,y)
Plt.show()结果:
原创作品来自程,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。