Python随机数小结——random和np.random的区别与联系-程序员宅基地

技术标签: random模块  python  numpy.random模块  随机数  

在python中,有两个模块可以产生随机数:
1. python自带random包: 提供一些基本的随机数产生函数,可满足基本需要
2. numpy.random:提供一些产生随机数的高级函数,满足高级需求

本文先分别介绍这两个包的常用函数,文末将总结一下两个包的区别。

目录


random 介绍

函数汇总

函数 功能 返回 备注
random.random() 生成一个 [0,1) 之间的均匀分布浮点数 一个浮点数
random.uniform(a,b) 生成一个 [a,b] 之间的均匀分布的浮点数,相当于 a + (b-a) * random.random() 一个浮点数 可以存在 a>b 的情况
random.randint(a, b) 生成一个 [a,b] 之间的随机整数 一个整数
random.randrange(a, b, step) 生成一个[a,b)之间间隔步长为step的随机整数 一个整数 如random.randrange(0, 20, 2),相当于从[0,2,4,6,…,18]中随机取一个
random.choice(seq) 从特定序列中随机取一个元素 一个元素 seq:字符串,列表,元组,range(a, b)**等。 若seq为空,则返回IndexError
random.choices(seq, weights=None, *, cum_weights=None, k=1) (依概率)从指定序列中(有放回)随机抽取 k 个元素,原始序列不变。可以设定 weights 或是 cum_weights 来改变元素权重 多个元素 seq:字符串,列表,元组,range(a, b)等:k 必须显式地赋值
random.sample(seq,k) 指定序列中(无放回)随机抽取 k 个元素,原始序列不变 多个元素 seq:字符串,列表,元组,range(a, b)等
random.shuffle(lst) 在原列表上将元素打乱,洗牌,原始序列改变 功能函数: 返回原序列打乱后的list lst: 只支持列表
import random

random.random()             # 0.5102632768396692
random.uniform(0,10)        # 6.890853912057401
random.randint(0,10)        # 5
random.randrange(0,10,2)    # 4


# random.choice()
string = 'nice to meet you'
tup = ('a', 'b', 'c', 'd')
lst = ['a', 'b', 'c', 'd']
random.choice(string)       # e
random.choice(tup)          # c
random.choice(lst)          # a


# random.choices()
lst = ['a', 'b', 'c', 'd']
random.choices(lst,k=3)     # ['a', 'a', 'c']


# random.sample()
string = 'nice to meet you'
tup = ('a', 'b', 'c', 'd')
lst = ['a', 'b', 'c', 'd']
random.sample(string,2)        # ['e', 'i']
random.sample(tup,2)           # ['c', 'b']
random.sample(lst,2)           # ['a', 'b']


# random.shuffle()
lst = ['a', 'b', 'c', 'd']
random.shuffle(lst)
print(lst)                     # ['b', 'd', 'c', 'a']

产生特定分布的函数

一下函数均输出一个数

函数 功能
random.random() 均匀分布: [0,1)之间
random.uniform(a, b) 均匀分布: [a,b]之间
random.gauss(mu, sigma) 高斯分布:以 mu 为均值,sigma 为标准差。guass()比normalvariate()稍快
random.normalvariate(mu, sigma) 正态分布:以 mu 为均值,sigma 为标准差
random.lognormvariate(mu, sigma) 对数正态分布
random.expovariate(lambd) 指数分布
random.triangular(low, high, mode) 三角分布
random.betavariate(alpha, beta) Beta分布
random.weibullvariate(alpha, beta) 韦伯分布
random.gammavariate(alpha, beta) Gamma分布
random.paretovariate(alpha) Pareto 分布

随机种子相关

函数 功能 备注
random.seed(a=None, version=2) 初始化随机种子 a 如果是 None 则使用当前的种子。 a 可以是 str, bytes, bytearray, 都会被转成 int。
random.getstate() 取得随机器内部状态
random.setstate(state) 设定随机器内部状态 state需为从 random.getstate() 获得的 state
import random
random.seed('foobar')     # 設定 random seed

# 随意消耗一些乱数
random.randint(0, 100)    # 32
random.randint(0, 100)    # 31
random.randint(0, 100)    # 44

rs = random.getstate()    # 储存当前的乱数状态

r0 = [random.randint(0, 100) for _ in range(10)]  # 生成 10 个乱数
random.setstate(rs)                               # 恢复乱数状态
r1 = [random.randint(0, 100) for _ in range(10)]  # 生成 10 个乱数

# r0, r1 随机数应该一样
r0 == r1                                          # True

注意:

如果要产生随机密码或token,请使用secrets模块,因为安全性问题,绝对不要使用random来产生密码。

Reference

python官方doc:9.6. random — Generate pseudo-random numbers
python Source code: Lib/random.py
random — 你所不知道的 Python 標準函式庫用法 02



numpy.random 介绍

numpy官方doc:Random sampling (numpy.random)

函数汇总

函数 功能 备注
numpy.random.seed(seed=None) 设定随机种子 seed : int or 1-d array_like, optional
numpy.random.rand(d0,d1,…,dn) 返回给定维度的array,每个数是服从开区间[0,1)均匀分布的浮点数
numpy.random.randn(d0,d1,…,dn) 返回给定维度的array,每个数是服从标准正态分布的浮点数
numpy.random.random_sample(size=None) 生成[0,1)之间均匀分布的浮点数
numpy.random.random(size=None) 生成[0,1)之间均匀分布的浮点数
numpy.random.ranf(size=None) 生成[0,1)之间均匀分布的浮点数
numpy.random.sample(size=None) 生成[0,1)之间均匀分布的浮点数
numpy.random.randint(low, high=None, size=None, dtype=’l’) 返回给定维度的整数array,每个数是开区间[low,high)或[0,low)均匀分布整数 dtype为数据类型,默认的数据类型是np.int
numpy.random.random_integers(low, high=None, size=None) 返回给定维度的整数array,每个数是闭区间[low,high]或[1,low]均匀分布整数 该函数在最新的numpy版本中已被替代,建议使用randint函数
numpy.random.choice(a, size=None, replace=True, p=None) (依概率)从给定的一维数组中(有放回或无放回地)随机选择 参数: a为一维数组类似数据或整数;size为数组维度;replace:True为有放回,False为无放回;p为数组中的数据出现的概率
numpy.random.shuffle(x) 原列表上将元素打乱。 与random.shuffle()一样 x: array or list

产生特定分布的函数

各分布函数详见numpy官方doc

常用函数示例

numpy.random.seed()

# 第一次 seed = 0
np.random.seed(0)
np.random.rand(5)
>> array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])

# 换一个seed
np.random.seed(1676)
np.random.rand(5)
>> array([0.39983389, 0.29426895, 0.89541728, 0.71807369, 0.3531823 ])

# 第二次 seed = 0,发现结果与第一次一样,即得到了可复现的随机数
np.random.seed(0)
np.random.rand(5)
>> array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])

numpy.random.rand()

根据给定维度生成均匀分布开区间[0,1)之间的数

import numpy as np

# numpy.random.rand
np.random.rand()  # 当没有参数时,返回单个数据
>> 0.8214199637356738

np.random.rand(4) # shape: 4
>> array([0.28966543, 0.2007679 , 0.87655807, 0.94153647])

np.random.rand(4,2) # shape: 4*2
>> array([[0.05436321, 0.7350782 ],
          [0.52215659, 0.53889898],
          [0.46468492, 0.71335749],
          [0.8038878 , 0.64666693]])

np.random.rand(4,3,2)  # shape: 4*3*2
>> array([[[0.34545913, 0.69313943],
           [0.79446914, 0.87836912],
           [0.65324253, 0.79146979]],

         [[0.62297291, 0.85356693],
          [0.54331809, 0.82817135],
          [0.41794522, 0.38204339]],

         [[0.67268369, 0.25551782],
          [0.71614578, 0.77045723],
          [0.27518846, 0.99426059]],

         [[0.20126485, 0.89100356],
          [0.04855106, 0.72816571],
          [0.50437136, 0.27798907]]])

numpy.random.randn()

返回给定维度的array,每个数服从标准正态分布

np.random.randn() # 当没有参数时,返回单个数据
>> -1.1241580894939212

np.random.randn(2,4)
>> array([[ 0.27795239, -2.57882503,  0.3817649 ,  1.42367345],
       [-1.16724625, -0.22408299,  0.63006614, -0.41714538]])

np.random.randn(4,3,2)
>> array([[[ 1.27820764,  0.92479163],
        [-0.15151257,  1.3428253 ],
        [-1.30948998,  0.15493686]],

       [[-1.49645411, -0.27724089],
        [ 0.71590275,  0.81377671],
        [-0.71833341,  1.61637676]],

       [[ 0.52486563, -1.7345101 ],
        [ 1.24456943, -0.10902915],
        [ 1.27292735, -0.00926068]],

       [[ 0.88303   ,  0.46116413],
        [ 0.13305507,  2.44968809],
        [-0.73132153, -0.88586716]]])

numpy.random.randint()

返回随机整数的array

np.random.randint(1,size=5) # 返回[0,1)之间的整数,所以只有0
>> array([0, 0, 0, 0, 0])

np.random.randint(1,5) # 返回1个[1,5)之间的随机整数
>> 4

np.random.randint(-5,5,size=(2,2)) # 返回[1,5)之间的随机整数
>> array([[ 2, -1],
          [ 2,  0]])

numpy.random.random_integers() 即将废弃

与numpy.random.randint()功能类似。该函数在最新的numpy版本中已被替代,建议使用randint()函数

np.random.random_integers(5,size=5)

__main__:1: DeprecationWarning: This function is deprecated. Please call randint(1, 5 + 1) instead
>> array([2, 4, 3, 4, 2])

生成[0,1)之间均匀分布的浮点数

print('-----------random_sample()--------------')
print(np.random.random_sample(size=(2,2)))
print('-----------random()--------------')
print(np.random.random(size=(2,2)))
print('-----------ranf()--------------')
print(np.random.ranf(size=(2,2)))
print('-----------sample()--------------')
print(np.random.sample(size=(2,2)))


# 输出:
-----------random_sample()--------------
[[0.70770026 0.32289658]
 [0.37320026 0.12638252]]
-----------random()--------------
[[0.47976139 0.82591445]
 [0.24703018 0.02357945]]
-----------ranf()--------------
[[0.90345548 0.77388432]
 [0.97383893 0.47288215]]
-----------sample()--------------
[[0.74441927 0.31705026]
 [0.55894275 0.79483591]]

numpy.random.choice()


# 从np.range(5)即0~4的整数中,(默认)有放回地等概率选择三个数
np.random.choice(5,3)  
>> array([1, 3, 3])

# 无放回地选择。此时输出size应小于range
np.random.choice(5, 3, replace=False)
>> array([0, 2, 3])



#从np.range(5)即0~4的整数中,(默认)有放回地选择3*2维的array数组
np.random.choice(5,size=(3,2))
>> array([[0, 2],
          [2, 2],
          [1, 4]])

#从列表中有放回地等概率选择元素,组成3*3维的array数组
list_ = ['a', 'b','c','d', 'e']
np.random.choice(list_,size=(3,3))
>> array([['c', 'b', 'a'],
          ['b', 'e', 'c'],
          ['d', 'b', 'b']], dtype='<U1')


# 不等概率随机选取
# 参数p为概率,长度应与参数a一致,p里的数据之和应为1
np.random.choice(list_,size=(3,3),p=[0.1,0.6,0.1,0.1,0.1])
>> array([['b', 'b', 'a'],
          ['b', 'b', 'b'],
          ['e', 'a', 'b']], dtype='<U1')

numpy.shuffle()

arr = np.arange(9).reshape((3, 3))
np.random.shuffle(arr)

arr
>> array([[3, 4, 5],
          [6, 7, 8],
          [0, 1, 2]])



两个包的区别

numpy.random比python原生random更灵活,具体如表:

比较内容 原生random numpy.random
输入类型 非空的列表类型(包括列表、字符串和元组) 非空的列表类型(包括列表、字符串和元组)+ numpy.array类型
输出维度 一个数或一个list(多个数) 可指定复杂的size
指定(a,b)范围 可以 整数可指定,浮点数不行,需自行转换
批量输出 不可 可。通过指定size参数
特定分布 涵盖了常用的几个分布; 只能单个输出 几乎涵盖了所有分布;可批量输出
有放回和无放回(选取元素时) sample()无放回选k个;choices()有放回选k个 choice()可有参数来指定有/无放回
不等概率取样 choices()指定weights参数 choice()指定p参数
shuffle()函数 random.shuffle(x)只支持list numpy.random.shuffle(x)支持array和list

numpy将原生random的sample()和choices()合并为一个numpy.choice()函数。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_20011607/article/details/82288561

智能推荐

【新手科研指南5】深度学习代码怎么读-小白阶段性思路(以手写数字识别应用为例)_深度学习程序怎么读-程序员宅基地

文章浏览阅读6.2k次,点赞6次,收藏26次。我是一个深度学习代码小白,请你用中文写上注释,能让我能轻松理解下面这段代码。注意包含所有函数、调用和参数的注释。以同样的python代码块样式返回你写的代码给我。代码看累了,就看《动手学深度学习》文档:基于PyTorch框架,从底层函数实现基础功能,再到框架的高级功能。努力上路的小白一枚,麻烦路过的大佬指导一二,同时希望能和大家交流学习~争取更新学习这个文档的专栏,记录学习过程。量身定做了一套话术hhh,亲身测试还不错。这个感觉更浅一点儿,之后复习看吧。20天吃掉那只Pytorch。_深度学习程序怎么读

Java学习路线图,看这一篇就够了!-程序员宅基地

文章浏览阅读2.7w次,点赞126次,收藏1.2k次。耗废1024根秀发,Java学习路线图来了,整合了自己所学的所有技术整理出来的2022最新版Java学习路线图,适合于初、中级别的Java程序员。_java学习路线

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签