我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python随机值怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python随机值怎么实现

本文小编为大家详细介绍“Python随机值怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python随机值怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

介绍

生成随机值的能力是一项重要的编程技能。即使你不是每天都需要它们,随机值仍然会出现在数量惊人的地方。当然,对于许多人来说,当他们想到随机值时,首先想到的是与游戏相关的用例,如洗牌、掷骰子和老虎机。

然而,随机值还有许多其他用途。这些包括:

  • 生成安全密码或密码重置 URL。

  • 创建用于测试用例或代码演示的示例数据。

  • 清理个人身份信息 (PII) 数据以准备数据以供分析。

与许多其他重要的编程任务一样,Python编程语言具有设计良好、一致的支持,可以生成随机值,作为Python标准库的一部分。一些相关模块包括random模块、secrets 模块和uuid模块。secrets模块提供加密性强的随机数,而random模块提供安全性较差的数字,可用于游戏、测试数据、模拟等。下面将讨论这两种类型的随机值之间的差异。

随机值与伪随机值

“真”随机数和伪随机数之间的主要区别:伪随机数生成器使用一种算法生成看似随机但具有确定性的数字序列。事实上,它们是如此确定,给定相同的种子值(或起始值),它们将可靠地生成相同的数字序列!另一方面,随机数生成器依赖物理过程来创建真正随机的数字。

虽然伪随机数生成器适用于许多用途,但它们不适用于需要真正随机性的应用,如密码学。这是因为知道算法的人可以预测序列中的下一个数字。因此,真正的随机数生成器对于安全关键应用至关重要。

随机和加密

正如我们在上一节中所讨论的,如果我们正在编写游戏或模拟数据,random模块是很好的。然而,如果我们处理授权令牌或其他安全数据,我们需要secrets模块。

随机模块

这两个模块之间还有其他区别。random模块是这两个模块中较老的一个,自Python版本1以来一直存在。它有一个大型函数接口,本质上是一个类的共享实例random.Random的包装器。然而,你始终可以构造自己的随机类并使用它。random.Random可以用已知种子实例化随机类,以给出可复制的随机数序列。如果缺失,将使用基于系统计时器的种子值。

此示例显示了选择种子对random.Random类的影响:

"""Creating random integers demo"""
from random import Random, randint

seed = 42
seeded_1 = Random(seed)
seeded_2 = Random(seed)
randomly_seeded = Random()

# Get a random number between 1 and 1000, inclusive
print(seeded_1.randint(1, 1000))
print(seeded_2.randint(1, 1000))
print(randomly_seeded.randint(1, 1000))

# Use the functional interface
print(randint(1,1000))
655
655
161
956

随机类的两个实例使用相同的种子实例化,生成了前两行输入。每次运行程序时,这些行打印655。(试试看!)。

最后两行是使用随机种子实例和函数接口(也是随机种子)创建的。代码随每次运行而变化,在这两行的情况下,数字排列的任何运行都是完全重合的。

加密模块

乍一看,在PEP 506中首次描述并首次出现在Python 3.6中的secrets模块看起来与Python随机模块非常不同。许多函数接口包装器都已经消失,因此,例如,你不能直接导入randint。此外,还有secrets.SystemRandom类将忽略你可能传递给它的任何种子值。

然而,如果我们在这些表面差异的下面进行描述,这两个类非常相似,实际上,从源代码来看:

  • secrets.SystemRandom类实际上是random.SystemRandom类的别名。

  • random.SystemRandomrandom.Random的子类。因此,一般来说,一个系统中可用的功能在另一个系统也可用。(两个例外是getstatesetstate,它们没有在SystemRandom中实现)。

内部最显著的区别是SystemRandom中的核心“随机化”行为是根据os.urandom实现的。反过来,urandom函数被传递一个整数,并使用依赖于平台的加密强随机值生成器返回许多随机字节。

我们现在知道我们可以使用这两个类中的任何一个,它们基本上是可互换的,但secrets.SystemRandom将更真实地随机,因此在更安全的环境中使用。

考虑到这一点,接下来让我们看一些用例。

生成随机数

Randint和Randrange

我们已经了解了如何使用randint在特定范围内生成随机数。randrange函数非常相似,只是它不包括上限,而randint的上限是包含的。如果你足够频繁地运行这段代码,第一行输出会出现5,但第二行不会。

from secrets import SystemRandom
rand = SystemRandom()

# Integers betewen 1 and 5, inclusive
print(rand.randint(1,5))   

# Integers between 1 and 5, but not including 5
print(rand.randrange(1,5))

生成随机分布

Random和SystemRandom共享了几种方法,允许你根据各种分布生成随机值。这些包括均匀分布(获得两个端点之间的浮点值,类似于randint提供的)、高斯(正态)分布等。

例如,我们可以创建一个包含20个虚拟IQ值的列表,这些值沿着与真实人群相同的正态曲线随机分布。根据定义,智商的平均值为100,标准差为15。(顺便说一句,为了本示例的目的,我们希望对这种分布建模,即使我们忽略了对这个想法和我们如何测试它提出的合理批评。)

以下是随机创建 20 个 IQ 的“群体”的代码:

"""IQ distribution"""
from secrets import SystemRandom
rand = SystemRandom()
population = [round(rand.gauss(100, 15)) for _ in range(0,20)]
print(population)

当然,输出会有所不同。这是一个有代表性的运行:

[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和chchoicesices这两种方法使你能够同时执行这两个步骤。这使得从任何类型的序列中选择所需大小的随机样本非常容易。

例如,给定上面的代码,假设我们想要获取IQ的总体,并从中选择一个或多个值。下面是我们可以快速完成的方法:

# Select one IQ at random
print(rand.choice(population))

# Select four IQs at random
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_letterspunctuationdigitsRandom.choices或者SystemRandom.choices可以调用其中任何一个来创建所需长度的数组,然后可以使用str类的join方法将数组转换为新字符串。

我们在以下示例中结合了这些步骤:

from string import ascii_letters, digits, punctuation, ascii_lowercase, ascii_uppercase
from secrets import SystemRandom
rand = SystemRandom()

four_digits = "".join(rand.choices(digits, k=4))
ten_mixed_case = "".join(rand.choices(ascii_letters, k=10))
assorted = ascii_letters + punctuation
twenty_assorted = "".join(rand.choices(assorted, k=20))

print(four_digits)
print(ten_mixed_case)
print(twenty_assorted)

代码输出:

8782
PLZYOxFLoQ
!mNsKsF;([I#F(c<JcG}

使用Secrets模块加密随机字符串

除了如上所示轻松创建随机字符串外,secrets模块还提供了几个函数,可用于生成各种格式的随机字节序列。在最低级别,我们可以使用token_bytes函数生成各种长度的原始“字节”数组。

from secrets import token_bytes
b = token_bytes(10)
print(type(b))
print(b)

代码输出:

<class 'bytes'>
b'!\x05P\xc6a\x87\xf9~(\xa9'

原始字节作为加密算法或类似算法的输入可能很有用,但请记住,它们不会包含有效的UTF-8代码点,因此不应使用此函数生成字符串。要获取字符串,可以使用上一节中的技术或下面两个函数中的一个。

我们可以返回一个字符串,它不是以原始格式获取字节,而是以十六进制格式再次由随机字节组成。这为每个字节提供了两个十六进制输出字符:

from secrets import token_hex
token = token_hex(10)
print(f"Returned a {type(token)} of length: {len(token)}:")
print(token)

代码输出:

Returned a <class 'str'> of length: 20:

同一系列中的第三个功能——在某些方面可能是最有用的——是token_urlsafe。此函数允许我们将随机字节字符串转换为稍微修改的base64编码字符串。在这里,每个字节平均产生1.3个字符,结果可以安全地用作URL-例如,表示缩短的URL或用作密码重置令牌。另一个好处是字符串来自比16位token_hex更大的潜在随机字符集。

from secrets import token_urlsafe
token = token_urlsafe(15)
print(token)

代码输出:

gfN2nGjO7izMPyXs5tvU

使用UUID:在Python中生成随机且唯一的值

虽然我们在本文中的重点是随机值,但我们现在想花一些时间讨论对于所有实际目的来说都是随机和唯一的值。解决这个问题的一种非常普遍的方法是通用唯一标识符(UUID)的概念。UUID是一个128位的数字,不能100%保证是唯一的,但在统计上很可能是唯一的,以至于发生冲突的机会非常小。

除了大数字之外,UUID还共享一种通用的表示格式。128位的数字可以表示为32个十六进制数字,而UUID添加四个连字符以形成一个36个字符的字符串,以8-4-4-6-12的模式排列。例如:

'967909e3-7231-4040-aae4-8b6b2fb96a0b'

Python模块uuid有几个不同的函数,对应于许多公认的算法,用于创建此类标识符,但建议使用两种最常见的类型之一,uuid1和uuid4。

uuid1值是通过将网络节点id(通常意味着网卡的mac地址)与有关UUID版本和变体的少量信息以及表示高分辨率时间戳的许多位相结合来创建的。

相反,uuid4值通常包含用于存储版本和变体信息的6位,以及122位纯随机数据。因此,根据维基百科,尽管原则上可能存在两个uuid4值的冲突,但在实践中,“在103万亿个版本4 UUIDs中找到重复的概率是十亿分之一。”。

你可以使用Python uuid模块轻松创建uuid1和uuid4值。正如我们将看到的,字符串表示看起来是相同的,尽管描述uuid1字段中的位更有意义。

from uuid import uuid1, uuid4

print(uuid1())
print(uuid4())

代码输出:

bfc89f3e-e6ab-11ec-abfc-4a9b744d17b8
025586c2-50ed-41a6-ae31-bf96b9d79df2

与本文中的大多数内容一样,当我们说“示例输出”时,实际上只是他代码运行其中一次的结果。当然,至少在uuid4的情况下,如果你运行这段代码103万亿次,你有十亿分之一的机会得到与我相同的结果。

在结束对UUID的讨论之前,我们在这里提到它们,因为它们是一个被广泛接受的标准,但正如我们所看到的,uuid4的实现与系统模块中的许多实用函数之间有很多重叠。例如,我经常看到uuid4函数用于在数据库中生成主键,特别是在NoSQL上下文中,其中可能不支持自动递增字段。原则上,人们也可以使用secrets.token_hex用于同样的任务,但uuid4可能会使代码的意图更加清晰。

附上产生随机数分布的图以及代码实现:

import random
import matplotlib.pyplot as plt

x = [random.randint(1, 100) for n in range(100)]
y = [random.randint(1, 100) for n in range(100)]
plt.figure(figsize=(8,6), dpi=80)
plt.scatter(x, y)
plt.show()

结果:

Python随机值怎么实现

读到这里,这篇“Python随机值怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python随机值怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python怎么实现随机森林算法

要实现随机森林算法,你可以使用scikit-learn库中的RandomForestClassifier类。下面是一个示例代码:```pythonfrom sklearn.ensemble import RandomForestClassi
2023-08-15

python随机抽奖系统怎么实现

要实现一个Python随机抽奖系统,可以按照以下步骤进行:1. 导入random模块,用于生成随机数。```pythonimport random```2. 创建一个参与抽奖的名单,可以使用列表或者字典来存储参与者的信息。```python
2023-08-16

Python怎么实现在字典中获取带权重的随机值

本篇内容介绍了“Python怎么实现在字典中获取带权重的随机值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现方式import rando
2023-07-04

python数组随机排序怎么实现

可以使用random模块的shuffle函数来实现Python数组的随机排序。shuffle函数可以随机打乱数组中的元素的顺序。下面是一个示例代码:pythonimport randomarr = [1, 2, 3, 4, 5]random
2023-10-26

python随机森林算法怎么实现

要实现随机森林算法,可以使用sklearn库中的RandomForestClassifier类。下面是一个简单的例子:```pythonfrom sklearn.ensemble import RandomForestClassifierf
2023-10-10

Python怎么实现随机生成算术题

这篇文章主要介绍“Python怎么实现随机生成算术题”,在日常操作中,相信很多人在Python怎么实现随机生成算术题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么实现随机生成算术题”的疑惑有所
2023-07-05

python怎么实现按概率生成随机数

可以使用Python中的random模块来生成随机数。如果要按照给定的概率分布生成随机数,可以使用random.choices()方法。以下是一个示例代码,演示如何按照给定的概率生成随机数:import random# 定义数字和对应的
2023-10-24

python中怎么实现一个随机数模块

python中怎么实现一个随机数模块,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。随机整数:>>> import random >>> random.randint(0,99
2023-06-17

Python如何实现随机漫步

本文小编为大家详细介绍“Python如何实现随机漫步”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现随机漫步”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 创建 RandomWalk 类
2023-07-05

Python怎么实现大乐透号码随机生成

这篇文章主要介绍“Python怎么实现大乐透号码随机生成”,在日常操作中,相信很多人在Python怎么实现大乐透号码随机生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么实现大乐透号码随机生成
2023-06-30

怎么在python中使用random实现随机函数

这篇文章将为大家详细讲解有关怎么在python中使用random实现随机函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的数据类型有哪些?python的数据类型:1. 数字类型
2023-06-14

Python怎么实现双色球号码随机生成

这篇“Python怎么实现双色球号码随机生成”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么实现双色球号码随机
2023-06-30

Python如何实现随机游走

这篇文章主要介绍了Python如何实现随机游走,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、单一的500步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现。注
2023-06-14

linux怎么给变量随机赋值

在Linux中,可以使用shell脚本来给变量随机赋值。可以使用`$RANDOM`变量来生成一个随机数,并将其赋值给需要的变量。以下是一个简单的示例,展示了如何随机赋值给一个变量:```bash#!/bin/bash# 生成一个0到100之
2023-08-23

mysql随机字符串怎么赋值

可以使用MySQL中的RAND()函数来生成随机字符串,并将其赋值给一个字段。以下是一个示例:UPDATE your_tableSET your_column = SUBSTRING(MD5(RAND()), 1, 10);在这个示例中
mysql随机字符串怎么赋值
2024-04-09

怎么用Python实现随机生成图片验证码

本篇内容主要讲解“怎么用Python实现随机生成图片验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现随机生成图片验证码”吧!导入模块import randomfrom
2023-06-26

Python 实现随机打乱字符串

from random import shuffledef shuffle_str(s): # 将字符串转换成列表 str_list = list(s) # 调用random模块的shuffle函数打乱列表 shuf
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录