详解Python中random库 - random的用法

详解Python中random库 - random的用法

random库

随机数在计算机应用中十分常见

Python通过random库提供各种伪随机数

基本可以用于除加密解密算法外的大多数工程应用

1、随机种子——seed(a=None)

(1)相同种子会产生相同的随机数

(2)如果不设置随机种子,以系统当前时间为默认值

from random import *

seed(10)

print(random())

seed(10)

print(random())

0.5714025946899135

0.5714025946899135

print(random()) #不设置deed,以系统当前时间为默认值,所以每次产生的都不同

0.4288890546751146

2、产生随机整数

(1)randint(a, b)

——产生[a, b]之间的随机整数(其中a和b都可以取到,左闭右闭区间)

from random import *

numbers = [randint(1,10) for i in range(10)]

numbers

[10, 1, 4, 8, 8, 5, 3, 1, 9, 8]

(2)randrange(a)

——产生[0, a)之间的随机整数,(不包含a,左闭右开区间)

from random import *

numbers = [randrange(10) for i in range(10)]

numbers

[5, 1, 3, 5, 0, 6, 2, 9, 5, 6]

(3)randrange(a, b, step)

——产生[a, b)之间以setp为步长的随机整数

from random import *

numbers = [randrange(0, 10, 2) for i in range(10)]

numbers

[6, 4, 4, 6, 2, 4, 4, 2, 6, 2]

3、产生随机浮点数

(1)random()

——产生[0.0, 1.0)之间的随机浮点数

from random import *

numbers = [random() for i in range(10)]

numbers

[0.9693881604049188,

0.613326820546709,

0.0442606328646209,

0.004055144158407464,

0.13397252704913387,

0.941002271395834,

0.3028605620290723,

0.3661456016604264,

0.8981962445391883,

0.31436380495645067]

(2)uniform(a, b)

——产生[a, b]之间的随机浮点数

from random import *

numbers = [uniform(2.1, 3.5) for i in range(10)]

numbers

[2.8685750576173676,

2.710443340673771,

2.190991846577591,

2.9183647159827024,

3.281695056726663,

2.318986485742369,

2.414018556160458,

2.678018290800777,

2.1516948166820806,

2.7952448980631672]

4、序列用函数

(1)choice(seq)

——从目标序列类型中随机返回一个元素

from random import *

choice(['win', 'lose', 'draw'])

'draw'

from random import *

choice("python")

'n'

(2)choices(seq,weights=None, k)

——对序列类型进行k次重复采样,可设置权重,权重小的说明被取到的概率更小

from random import *

choices(['win', 'lose', 'draw'], k=5)

['win', 'draw', 'win', 'lose', 'draw']

from random import *

choices(['win', 'lose', 'draw'], [4,4,2], k=10) # 这里的[4,4,2]就是每个元素分别对应的权重

['draw', 'win', 'draw', 'lose', 'lose', 'draw', 'win', 'win', 'draw', 'lose']

(3)shuffle(seq)

——将序列类型中元素随机排列,返回打乱后的序列

from random import *

numbers = ["one", "two", "three", "four"]

shuffle(numbers)

numbers

['two', 'four', 'one', 'three']

(4)sample(pop, k)

——从pop类型中随机选取k个元素,以列表类型返回,如果k大于所有元素的个数,则报错

from random import *

sample([10, 20, 30, 40, 50], k=3)

[20, 30, 10]

5、概率分布——以高斯分布为例

gauss(mean, std)

——生产一个符合高斯分布的随机数,mean–均值,std–标准差

from random import *

number = gauss(0, 1)

number

0.6331522345532208

多生成几个

import matplotlib.pyplot as plt

res = [gauss(0, 1) for i in range(100000)]

plt.hist(res, bins=1000)

plt.show()

【例1】用random库实现简单的微信红包分配

import random

def red_packet(total, num):

for i in range(1, num):

per = random.uniform(0.01, total/(num-i+1)*2) # 保证每个人获得红包的期望是total/num

total = total - per

print("第{}位红包金额: {:.2f}元".format(i, per))

else:

print("第{}位红包金额: {:.2f}元".format(num, total))

red_packet(10, 5)

第1位红包金额: 1.85元

第2位红包金额: 3.90元

第3位红包金额: 0.41元

第4位红包金额: 3.30元

第5位红包金额: 0.54元

import random

import numpy as np

def red_packet(total, num):

ls = []

for i in range(1, num):

per = round(random.uniform(0.01, total/(num-i+1)*2), 2) # 保证每个人获得红包的期望是total/num

ls.append(per)

total = total - per

else:

ls.append(total)

return ls

# 重复发十万次红包,统计每个位置的平均值(约等于期望)

res = []

for i in range(100000):

ls = red_packet(10,5)

res.append(ls)

res = np.array(res)

print(res[:10])

np.mean(res, axis=0)

[[1.71 1.57 0.36 1.25 5.11]

[1.96 0.85 1.46 3.29 2.44]

[3.34 0.27 1.9 0.64 3.85]

[1.99 1.08 3.86 1.69 1.38]

[1.56 1.47 0.66 4.09 2.22]

[0.57 0.44 1.87 5.81 1.31]

[0.47 1.41 3.97 1.28 2.87]

[2.65 1.82 1.22 2.02 2.29]

[3.16 1.2 0.3 3.66 1.68]

[2.43 0.16 0.11 0.79 6.51]]

array([1.9991849, 2.0055725, 2.0018144, 2.0022472, 1.991181 ])

【例2】生产4位由数字和英文字母构成的验证码

import random

import string

print(string.digits)

print(string.ascii_letters)

s=string.digits + string.ascii_letters

v=random.sample(s,4)

print(v)

print(''.join(v))

0123456789

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

['n', 'Q', '4', '7']

nQ47

相关阅读

有钱花借款审批多久 有钱花借款申请多久
365bet网站是多少

有钱花借款审批多久 有钱花借款申请多久

📅 07-14 👁️ 183
测井简称
365bet网站是多少

测井简称

📅 07-19 👁️ 1210
从英寸[in]转换为厘米[cm]
日博365网

从英寸[in]转换为厘米[cm]

📅 07-03 👁️ 7245