Python用random和numpy.random产生随机数

一、用Python自带的random模块实现
random模块中,以rand开头的方法只有三个,分别是random,randint,randrange,其中randint为randrange的特例。记住:方法名中最短的是6个字母的那个random.random()方法,你在自带的random模块中凡是调用小于6个字母且以rand开头的方法都是错误的!

import random
print(random.random()) #在区间[0, 1)内产生一个随机浮点数
print(random.randint(1,4)) #在区间[a, b]内产生一个随机整数
print(random.randrange(2,7,2)) #在区间range(start, stop[, step])下产生一个随机整数,不包含stop,本例只能在2/4/6三个数中产生
print(random.uniform(12,16)) #在区间[a, b) 内产生一个随机浮点数

运行结果:
0.6187768105862372
1
4
15.01870211317274

此外还有random.choice(sequence)、random.shuffle(x[, random])、random.sample(sequence, k)等方法,请自行百度。

二、用numpy的random模块实现
现在要求产生一个2行4列的浮点数数组,每个浮点数的区间为[0, 1),如果用Python自带的random库实现,代码如下:

import random
import numpy as np
n =  [ random.random() for i in range(8)]
n = np.array(n).reshape(2,4)
print(n)

运行结果:
[[ 0.11365106 0.0953035 0.83630837 0.88000645]
[ 0.81532003 0.31082616 0.16808592 0.36172359]]

方法笨拙、有效,是否有更简便的方法呢?

(1)random.rand (d0, d1, …, dn)
创建一个指定维度的随机浮点数数组,每个浮点数的范围为[0, 1),基础功能等价于之前的random.random()

from numpy import random
print(random.rand(2,4))

运行结果:
[[ 0.41423502 0.29607993 0.62878791 0.57983781]
[ 0.5999292 0.26581912 0.28468588 0.25358821]]
提示:python自带的随机数功能一般为产生一个数,而numpy.random模块在产生数的时候,一般需要指定维度大小,因为numpy是为向量而生的!

(2)random.randn (d0, d1, …, dn)
创建一个正态分布的随机浮点数数组,均值为0,标准差为1,每个浮点数的范围为[0, 1)。

from numpy import random
print(random.randn(2,5))

运行结果:
[[ 0.7583426 -1.05723546 -0.12770496 -1.92006576 -0.73522534]
[ 1.95297529 0.54144757 -1.26715335 0.50051637 1.59260179]]
对比Python自带的random模块可以发现,在numpy.random模块中,一个是4个字母的方法rand,一个是5个字母的方法randn,两者都可以产生一个0-1之间的浮点数

(3)random.uniform(low,high, size=None)产生一个指定[low, high)范围、均匀分布的浮点数数组

print(random.uniform(3,5,(2,5)))

运行结果:
[[ 3.24467229 4.80136313 3.45819832 4.14716794 3.97951204]
[ 4.68337576 3.36074955 4.26769826 3.53562288 3.27459286]]

(4)random.randint(low, high=None, size=None, dtype=‘l’)产生一个指定[low, high)范围、均匀分布的整数数数组

print(random.randint(3,5,(2,5)))

运行结果:
[[4 3 3 3 4]
[3 4 4 4 4]]

(5)random. normal(loc=0.0, scale=1.0, size=None)在一个指定均值loc、标准差scale的正态分布中随机抽取指定size大小的样本

print(random.normal(3.5, 2.2, (3,4)))

运行结果:
[[ 4.71321053 6.13198025 2.33444535 7.45976511]
[ 2.42028688 1.44674274 7.1084067 3.44898467]
[ 2.75945659 2.14206063 0.91246563 3.9049633 ]]

(6)random.seed设定产生随机数的种子

random.seed(5)
print(random.rand(2,4))
print('*'*50)
print(random.rand(2,4))

运行结果:
[[ 0.22199317 0.87073231 0.20671916 0.91861091]
[ 0.48841119 0.61174386 0.76590786 0.51841799]]


[[ 0.2968005 0.18772123 0.08074127 0.7384403 ]
[ 0.44130922 0.15830987 0.87993703 0.27408646]]

可以发现,第二次调用random.rand时,由于系统默认改变了种子,所以每次产生的数与第一组不一样。当要每次产生的随机数都一样时,可以设定random.seed(种子),来固定产生的随机数。这在做某些情况下,在指定的数据集上做验证性实验时,非常有效。

random.seed(5)
print(random.rand(2,4))
print('*'*50)
random.seed(5)
print(random.rand(2,4))

[[ 0.22199317 0.87073231 0.20671916 0.91861091]
[ 0.48841119 0.61174386 0.76590786 0.51841799]]


[[ 0.22199317 0.87073231 0.20671916 0.91861091]
[ 0.48841119 0.61174386 0.76590786 0.51841799]]

三、问答环节
(1)random.randint和numpy.random.randint都能产生随机整数,两者有什么主要区别?
答:第一,numpy.random.randint除了指定low, high外,通常还需要指定数组的size,即numpy中的随机数功能着眼于矢量,而random.randint不具备一次性产生整个数组的功能。 第二,random.randint产生的随机数区间为[low, high],而numpy.random.randint的随机数区间为[low, high)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值