广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中生成随机数据的方法
  • 848
分享到

Python中生成随机数据的方法

2023-06-30 02:06:54 848人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python中生成随机数据的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中生成随机数据的方法”吧!随机性有多随机大多数用 Python 生成的随机数据在

这篇文章主要讲解了“python中生成随机数据的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中生成随机数据的方法”吧!

    随机性有多随机

    大多数用 Python 生成的随机数据在科学意义上并不是完全随机的。相反是伪随机的:使用伪随机数生成器(PRNG)生成,它本质上是任何用于生成看似随机但仍可重现的数据的算法。『真』随机数可以由真随机数生成器(TRNG)生成。

    可能已经 Python 中看到过类似 random.seed(999) 的东西。此函数调用 Python 模块 random.seed(1234) 使用的底层随机数生成器。random 使得后续调用生成随机数具有确定性:输入 A 总是产生输出 B。

    也许『随机』和『确定性』这两个术语似乎不能并存。为了更清楚地说明这一点这里有一个极其精简的版本,random() 它通过使用迭代创建一个『随机』数字 x = (x * 3) % 19 。x 最初定义为种子值,然后根据该种子变形为确定性的数字序列。

    class NotSoRandom(object):    def seed(self, a=3):        """随机数生成器"""        self.seedval = a    def random(self):        """随机数"""        self.seedval = (self.seedval * 3) % 19        return self.seedval_inst = NotSoRandom()seed = _inst.seedrandom = _inst.randomfor i in range(10):    seed(123)    print([random() for _ in range(10)])    [8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11][8, 5, 15, 7, 2, 6, 18, 16, 10, 11]

    加密安全

    如果对『RNG』首字母缩略词还不够了解,再添加一个 CSPRNG,或加密安全 PRNG。 CSPRNG 适用于生成敏感数据,例如密码、身份验证器和令牌。 给定一个随机字符串,实际上无法确定在随机字符串序列中哪个字符串出现在该字符串之前或之后。

    另一个术语熵,引入或期望的随机性数量。 例如将在介绍的一个 Python 模块定义了 DEFAULT_ENTROPY = 32,即默认返回的字节数。

    关于 CSPRNG 的一个关键点是它们仍然是伪随机的。它们以某种内部确定性的方式设计,但添加了一些其他变量或具有使它们『足够随机』以禁止返回到任何强制执行确定性的函数的属性。

    Python 工具中的 PRNG 和 CSPRNG :

    • PRNG 选项包括 Python 标准库中的 random 模块及其基于数组的 NumPy 对应模块 numpy.random。

    • Python 的 os、secrets 和 uuid 模块包含用于生成加密安全对象的函数。

    PRNG

    Python中生成随机数据的方法

    random 模块

    random模块是在 Python 中生成随机数据的最广为人知的工具可,使用Mersenne Twister PRNG 算法作为其核心生成器。

    构建一些没有播种的随机数据。该 random.random() 函数返回区间 [0.0, 1.0) 内的随机浮点数。

    import randomrandom.random()0.1250920165739744random.random()0.7327868824782764

    使用 random.seed(),可以使结果可重现,并且之后的调用链random.seed() 将产生相同的数据轨迹。

    随机数序列变为确定性的,或完全由种子值确定。

    random.seed(444)random.random()0.3088946587429545random.random()0.01323751590501987random.seed(444)random.random()0.3088946587429545random.random()0.01323751590501987

    使用 random.randint() 可以使用该函数在 Python 中的两个端点之间生成一个随机整数。数据在整个 [x, y] 区间并且可能包括两个端点。

    >>> random.randint(0, 10)2>>> random.randint(500, 50000)9991

    使用 random.randrange() 可以排除区间的右侧,生成的数字始终位于 [x, y) 范围内,并且始终小于右端点。

    random.randrange(1, 10)9

    使用 random.unifORM(),从连续均匀分布中提取生成位于特定 [x, y] 区间内的随机浮点数。

    random.uniform(20, 30)27.42639687016509random.uniform(30, 40)36.33865802745107

    使用 random.choice() 从非空序列(如列表或元组)中选择随机元素。

    items = ['A', 'B', 'C', 'D', 'E']random.choice(items)'B'random.choices(items, k=2)['A', 'C']random.choices(items, k=3)['C', 'D', 'E']

    使用 random.sample() 不替换的情况下模拟采样。

    random.sample(items, 4)['A', 'D', 'B', 'E']

    使用 random.shuffle() 修改序列对象并随机化元素的顺序。

    random.shuffle(items)items['E', 'B', 'A', 'C', 'D']

    生成一系列唯一长度一致的随机字符串的例子,一般用于验证码这种。

    from random import Random# 随机生成邮件验证码的随机字符串def RandomsStr(random_length):    Str = ''    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'  # 设置可选字符    length = len(chars) - 1    random = Random()    for i in range(random_length):        Str += chars[random.randint(0, length)]    return StrRandomsStr(10)LhK3vFepchRandomsStr(16)iGy1g0FO54Cjx3WP

    数组 numpy.random

    大多数函数都 random 返回一个标量值(单个int、float或其他对象)。生成序列的话可以使用列表生成的方法。

    [random.random() for _ in range(5)][0.7401011155476498, 0.9892634439644596, 0.36991622177966765,  0.14950913503744223,  0.4868906039708182]

    numpy.random 使用自己的 PRNG,与普通的 random 不太一样。

    """从标准正态分布返回样本"""np.random.randn(5)array([-0.59656657, -0.6271152 , -1.51244475, -1.02445644, -0.36722254])np.random.randn(3, 4)array([[ 0.34054183,  1.59173609, -0.5257795 , -0.86912511],       [-0.86855499, -0.64487065,  1.47682128,  1.8238103 ],       [ 0.05477224,  0.35452769,  0.14088743,  0.55049185]])"""根据概率随机分配"""np.random.choice([0, 1], p=[0.6, 0.4], size=(5, 4))array([[0, 1, 0, 1],       [0, 1, 1, 1],       [0, 1, 0, 1],       [1, 0, 0, 0],       [0, 0, 0, 0]])"""创建一系列随机布尔值"""np.random.randint(0, 2, size=25, dtype=np.uint8).view(bool)array([ True, False,  True,  True, False,  True, False, False, False,       False, False,  True,  True, False, False, False,  True, False,        True, False,  True,  True,  True, False,  True])

    相关数据的生成

    假设要模拟两个相关的时间序列。解决此问题的一种方法是使用 NumPy 的multivariate_normal() 函数,该函数将协方差矩阵考虑在内。换句话说要从单个正态分布的随机变量中提取,需要指定其均值和方差(或标准差)。

    def corr2cov(p, s):    """相关性和标准差的协方差矩阵"""    d = np.diag(s)    return d @ p @ dcorr = np.array([[1., -0.40],[-0.40, 1.]])stdev = np.array([6., 1.])mean = np.array([2., 0.5])cov = corr2cov(corr, stdev)data = np.random.multivariate_normal(mean=mean, cov=cov, size=50)data[:10][[-0.33377432  0.22889428] [-1.5311996   0.31678635] [-6.02684472  0.90562824] [ 5.2696086   0.86518295] [ 6.43832395  0.36507745] [-8.49347011  0.68663565] [-5.05968126  0.55214914] [ 2.02314646  1.32325775] [ 0.98705556 -0.63118682] [ 2.90724439 -1.26188307]]

    random模块与NumPy对照表

    random模块NumPy 对应方说明
    random()rand()[0.0, 1.0) 中的随机浮点数
    randint(a, b)random_integers()[a, b] 中的随机整数
    randrange(a, b[, step])randint()[a, b) 中的随机整数
    uniform(a, b)uniform()[a, b] 中的随机浮点数
    choice(seq)choice()随机元素来自seq
    choices(seq, k=1)choice()带有替换的随机k元素seq
    sample(population, k)choice()和replace=False无替换的随机k元素seq
    shuffle(x[, random])shuffle()将序列随机打乱
    normalvariate(mu, sigma)或者gauss(mu, sigma)normal()mu具有均值和标准差的正态分布样本sigma

    CSPRNG

    Python中生成随机数据的方法

    尽可能随机 os.urandom()

    在不涉及太多细节的情况下,生成依赖于操作系统的随机字节,可以安全地称为密码安全 secretsuuidos.urandom(),在技术上仍然是伪随机的。

    唯一的参数是要返回的字节数。

    os.urandom(3)b'\xa2\xe8\x02'x = os.urandom(6)xb'\xce\x11\xe7"!\x84'type(x), len(x)(bytes, 6)

    但是这种保存格式不太符合开发的要求。

    secrets 最佳保存方式

    Python 3.6+ 版本引入的 PEP,secrets模块旨在成为事实上的 Python 模块,用于生成加密安全的随机字节和字符串。

    secrets 基本上是一个包装器 os.urandom()。只导出了少数用于生成随机数、字节和字符串的函数。

    n = 16# 生成安全令牌secrets.token_bytes(n)b'A\x8cz\xe1o\xf9!;\x8b\xf2\x80pJ\x8b\xd4\xd3'secrets.token_hex(n)'9cb190491e01230ec4239cae643f286f'  secrets.token_urlsafe(n)'MJoi7CknFu3YN41m88SEgQ'# `random.choice()` 的安全版本secrets.choice('rain')'a'

    UUID

    生成随机令牌的最后一个选项是 Python 的 uuid 模块中的 uuid4() 函数。 UUID 是一个通用唯一标识符,一个 128 位序列(长度为 32 的字符串),旨在『保证跨空间和时间的唯一性』。 uuid4() 是该模块最有用的函数之一,该函数也使用了 os.urandom()。

    import uuiduuid.uuid4()UUID('3e3ef28d-3ff0-4933-9bba-e5ee91ce0e7b')uuid.uuid4()UUID('2e115fcb-5761-4fa1-8287-19f4ee2877ac')

    可能还看到了其他一些变体:uuid1()、uuid3() 和 uuid5()。它们之间的主要区别在于这 uuid4() 三个函数都采用某种形式的输入,不符合 uuid4() 的『保证跨空间和时间的唯一性』。

    除了安全模块(例如 secrets)之外,Python 的 random 模块实际上还有一个很少使用的类,称为 SystemRandom,它使用 os.urandom()。 (反过来,SystemRandom 也被秘密使用。这有点像一个可以追溯到 urandom() 的网络。)

    那么为什么不『默认』这个版本? 为什么不『永远安全』,而不是默认使用在密码学上不安全的确定性随机函数?

    因为有时希望数据具有确定性和可重复性,以供其他人后续使用。

    时间效率问题。

    """CSPRNG 至少在 Python 中,往往比 PRNG 慢得多。 让我们使用脚本 timed.py 来测试,该脚本使用 timeit.repeat() 比较 randint() 的 PRNG 和 CSPRNG 版本。"""import randomimport timeit# CSPRNG 版本依次使用 `SystemRandom()` 和 `os.urandom()`。_sysrand = random.SystemRandom()def prng() -> None:    random.randint(0, 95)def csprng() -> None:    _sysrand.randint(0, 95)setup = 'import random; from __main__ import prng, csprng'if __name__ == '__main__':    print('Best of 3 trials with 1,000,000 loops per trial:')    for f in ('prng()', 'csprng()'):        best = min(timeit.repeat(f, setup=setup))        print('\t{:8s} {:0.2f} seconds total time.'.format(f, best))Best of 3 trials with 1,000,000 loops per trial:prng()   0.93 seconds total time.csprng() 1.70 seconds total time.

    工程随机性的比较

    封装/模块描述加密安全
    random使用 Mersenne Twister 快速简单的随机数据
    numpy.random像random但对于(可能是多维的)数组
    os包含urandom(),这里介绍的其他功能的基础
    secrets设计为 Python 的事实上的模块,用于生成安全的随机数、字节和字符串
    uuid用于构建 128 位标识符的一些函数的所在地uuid4()是

    感谢各位的阅读,以上就是“Python中生成随机数据的方法”的内容了,经过本文的学习后,相信大家对Python中生成随机数据的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: Python中生成随机数据的方法

    本文链接: https://www.lsjlt.com/news/327117.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • Python中生成随机数据的方法
      这篇文章主要讲解了“Python中生成随机数据的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中生成随机数据的方法”吧!随机性有多随机大多数用 Python 生成的随机数据在...
      99+
      2023-06-30
    • Python生成随机数组的方法小结
      本文实例讲述了Python生成随机数组的方法。分享给大家供大家参考,具体如下: 研究排序问题的时候常常需要生成随机数组来验证自己排序算法的正确性和性能,今天把Python生成随机数组的方法稍作总结,以备以后...
      99+
      2022-06-04
      数组 小结 方法
    • java随机数生成的方法
      本文小编为大家详细介绍“java随机数生成的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“java随机数生成的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本教程操作环境:windows7系统、java...
      99+
      2023-06-30
    • numpy生成随机数的方法
      numpy生成随机数的方法有:1、numpy.random.rand();2、numpy.random.randn();3、numpy.random.randint();4、numpy.random.random();5、numpy.ran...
      99+
      2023-11-21
      numpy
    • Qt生成随机数的方法
      目录1.生成随机数2.生成不重复的随机数3.生成递增的随机数1.生成随机数         生成随机数主要用到了函数qsrand和qrand,这两个函数在#include <Q...
      99+
      2022-11-12
    • python生成随机数、随机字符、随机字符串的方法示例
      本文是基于Windows 10系统环境,实现python生成随机数、随机字符、随机字符串: Windows 10 PyCharm 2018.3.5 for Windows ...
      99+
      2022-11-12
    • python生成随机数
      import random  #导入模块 sec=random.randint(1,10)  #使用randint函数生成1至10的随机数 print(sec) #打印生成的随机数...
      99+
      2023-01-31
      随机数 python
    • Python生成随机数的方法详解(最全)
      目录使用 random 模块使用 NumPy 库使用 secrets 模块使用 random.org 网站使用 random.choices()方法python生成随机数都有哪些办法...
      99+
      2023-02-07
      Python生成随机数方法 Python生成随机数 Python 随机数
    • python随机生成数字的方法有哪些
      Python中生成随机数字的方法有以下几种:1. 使用random模块的random()函数:生成0到1之间的随机浮点数。```pythonimport randomnum = random.random() # 生成一个0到1之间的随...
      99+
      2023-08-11
      python
    • 【Python】 Python中生成随机整数
      在Python中生成一到一百随机整数是一项基本任务,不仅可以帮助我们进行调试和演示,还可以用于生成测试数据或进行随机化实验。在本篇文章中,我们将从多个方面对如何在Python中生成一到一百随机整数进行详细阐述,并给出代码示例。 一、使用ra...
      99+
      2023-09-22
      python 开发语言 数据结构
    • python生成随机浮点数的方法有哪些
      Python生成随机浮点数的方法有以下几种:1. 使用random模块的random()函数:```pythonimport ran...
      99+
      2023-09-06
      python
    • R语言生成随机数的方法
      这篇文章主要介绍R语言生成随机数的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.概述作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆。R语言可以针对不同的分布,生成该分布下的随机数。...
      99+
      2023-06-14
    • java生成随机数的三种方法
      随机数有三种生成方式:通过Math.random()方法通过System.currentTimeMillis()方法获取毫秒数通过Random类第一种:常用方法Math.random()方法,是获取0-1之间的double类型的小数,在通过...
      99+
      2014-08-11
      java入门 java 随机数
    • Android生成随机数的方法实例
      本文实例为大家分享了Android生成随机数的具体代码,供大家参考,具体内容如下 java文件 package com.example.my_xm_bw_luowei; imp...
      99+
      2022-11-11
    • java中生成随机数的方法有哪些
      这篇文章将为大家详细讲解有关java中生成随机数的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。生成随机数的几种方法:1. 使用Math.random()生成随机数直接贴几个小方法private...
      99+
      2023-05-31
      java
    • Qt生成随机数的方法是什么
      这篇文章主要介绍“Qt生成随机数的方法是什么”,在日常操作中,相信很多人在Qt生成随机数的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt生成随机数的方法是什么”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-21
    • JS生成随机数的方法有哪些
      JS生成随机数的方法有以下几种:1. Math.random():返回一个0到1之间的随机浮点数。```javascriptvar ...
      99+
      2023-09-12
      JS
    • java生成不重复随机数的方法
      Java中产生随机数调用java.lang下面Math类中的random()方法产生随机数新建一个文件后缀名为java的文件,文件名取为MyRandom,该类中编写如下的代码:public class MyRandom { public s...
      99+
      2016-11-18
      java基础 java
    • java生成随机数的方法有哪些
      Java生成随机数的方法有以下几种:1. 使用`java.util.Random`类:可以使用`nextInt()`方法生成一个随机...
      99+
      2023-08-31
      java
    • python随机数如何生成
      在Python中,可以使用random模块来生成随机数。以下是几种常见的生成随机数的方法:1. 生成一个0到1之间的随机浮点数,使用...
      99+
      2023-09-25
      python
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作