python应用之random模块(居然还有那么多的随机算法函数)

       random 是 Python 的一个常用的内置模块,模块提供了生成随机数的功能,包含了多种生成随机数的函数,比如生成随机整数、随机浮点数、从序列中随机选择元素等。

使用 random模块

要使用 random模块,直接导入它即可。

import random

以下是random模块提供的主要函数:

常用方法介绍:

1. random()

生成一个[0.0, 1.0)范围内的不包含整数1随机浮点数(大于等于0,小于1的小数)。

测试代码:

print(random.random())

执行后结果:

0.3336493107060039

如果想保留小数,可以用round函数或者decimal.Decimal函数

1)使用round函数保留几位小数,在round第2个参数中传入数字几,比如保留3位小数

print(round(random.random(),3))

2)使用Decimal函数,保留3位小数

from decimal import Decimal
print(Decimal(str(random.random())).quantize(Decimal('0.000')))

Decimal模块的用法可参见之前的文章:浮点数精度介绍

2. randint(a, b)

生成一个指定范围内的随机整数,包括a和b的值

测试代码:

print(random.randint(1,100))

多次执行后结果:

69

19

67

3 randrange(start, stop=None, step=1)

从指定的范围内返回一个随机整数,类似于range()函数。randint函数其实调用的也是该函数。

关于参数:

  • 如果不传stop和step参数,start参数必须大于0,否则报错。此时会随机生成比start小的整数。
  • 如果不传stop,传的step参数必须等于1,否则会报错。
  • 如果传了stop和step参数,step不等于1时则随机生成一个start和stop之间步长为step的整数。step=1时生成在start和stop之间,并且小于stop的数(不同于randint函数)

具体的按照step计算方式参考源代码:

测试代码:

#随机生成1到1000步长为10的整数

print(random.randrange(1,1000,10))

#随机生成5到99之间的整数

print(random.randrange(5,100))

#随机生成小于100的整数

print(random.randrange(100))

4. choice(seq)

从非空序列seq中随机选取一个元素。seq是支持切片的对象,比如列表list,元组tuple,字符串str,字节串bytes等。

测试代码:

seq_list = [1,2,3]
print(random.choice(seq_list))

5 random.choices(population, weights=None, *, cum_weights=None, k=1)

从给定的序列中随机选择1个或者多个元素,返回的是列表list;我们可以指定每个元素被选中的概率,或者指定要选择的元素数量。该函数在Python 3.6及更高版本中才支持。

参数:

  • population:一个支持切片的序列,用于从中随机选择元素。
  • weights(可选):一个序列,指定了population中每个元素被选中的相对概率;weights的长度需要等于population的长度;默认情况下,所有元素的选中概率是相等的。
  • k(可选):一个整数,指定要选择的元素数量。默认为1。K可以大于序列的长度。
  • cum_weights(可选):一个序列,用于指定累积权重。cum_weights的长度需要等于population的长度;如果提供了cum_weights,则不能传weights,否则报错;累积权重的值应该由小到大。

测试代码:

# 示例1:从列表中随机选择两个元素
print(random.choices(seq_list, k=2))

# 示例2:从列表中随机选择4个元素 元素会重复
print(random.choices(seq_list, k=6))

# 示例3:指定权重
weights = [1, 3, 1,1,1] # 数字2被选中的概率是其他数字的三倍
print(random.choices(seq_list, weights=weights, k=2))

# 示例4:使用累积权重 值由小到大
cum_weights = [3, 4, 5,10,20]
print(random.choices(seq_list, cum_weights=cum_weights, k=2))

# 示例5:使用累积权重 权重值由大到小
cum_weights = [20, 10, 5,3,1]
print(random.choices(seq_list, cum_weights=cum_weights, k=2))

结果:前4个每次执行结果可能不同,最后一个因为权重设置问题每次都是结果[1,1]

[4, 5]

[2, 3, 4, 3, 4, 2]

[2, 1]

[1, 5]

[1, 1]

6 shuffle(x,random=none)

用于打乱序列x的元素。函数会直接修改序列x,没有return。

参数:

  • x : 支持切片的序列
  • random:默认为none,也可以传random.random函数。不过该参数从Python 3.9开始,将在后续版本中删除。

测试代码:

seq_list = [1,2,3,4,5]
random.shuffle(seq_list)
print(seq_list)

random.shuffle(seq_list,random.random)
print(seq_list)

结果:

[1, 3, 5, 4, 2]

[5, 2, 1, 4, 3]

7 sample(population, k,*,counts=None)

从指定的序列population中随机获取k个不重复的元素,并返回一个list。

参数:

  • population:一个支持切片的序列,用于从中随机选择元素。
  • k:一个整数,指定要选择的元素数量。K不能大于序列的长度。
  • counts:可以指定序列population中元素重复的次数;传入的是一个数字元素的序列,序列长度跟population一致;数字越大,元素重复的次数变多,意味着被随机到的概率也会变大,也会返回相同的元素;如果不带这个参数,返回的元素不会重复。

举例:

seq_list = [1,2,3]
counts = [2,2,1]

上述seq_list 等同于[1,1,2,2,3], 第1个和第2个元素重复2次。

测试代码:

seq_list = [1,2,3,4,5]
#随机返回2个元素
print(random.sample(seq_list,2))

#每个元素重复2次,随机返回2个元素
print(random.sample(seq_list,2,counts=[2,2,2,2,2]))

8 randbytes(n)

随机生成n个字节的字节码。

测试代码:

print(random.randbytes(20)) #20个字节

结果:

b'\xff\x19\xb7*{\x88\x9d\xb5\xea-\x10\x1dA}\xa9\xce\xaf$\xf8\x0f'

9 getrandbits(k)

随机生成k个比特位bit(1个字节=8的比特位),返回一个在范围在[0, 2**k) 范围内的随机整数。上面的randbytes函数调用的就是该函数。

测试代码:

print(random.getrandbits(20))

结果: 每次执行结果不同

503161

10 seed(a=None,version=2)

设置a等于某个值时,确保每次运行程序时生成的随机数序列都是相同的。保持默认值,每次运行程序时生成的随机数序列可能会不同。

测试代码:

random.seed('a')
print(random.randbytes(20))
print(random.getrandbits(20))

每次执行后结果都一样

11 uniform(a,b)

生成一个在指定范围内[a, b](包含a和b)的随机浮点数。a和b可以是整数或者浮点数。

测试代码:

print(random.uniform(0.1,10))

执行后返回的浮点数每次都不同

3.1062124017808896

12 其他几个函数

  • normalvariate(mu,sigma): 返回一个符合正态分布(均值为mu,标准差为sigma)的随机浮点数。
  • gauss (mu,sigma): 同normalvariate功能。
  • triangular(low=0.0, high=1.0, mode=None): 返回一个生成三角形分布的随机数。
  • lognormvariate(mu,sigma): 返回一个符合对数正态分布(均值为mu,标准差为sigma)的随机浮点数。
  • expovariate(lambd)函数用于生成一个符合指数分布的随机浮点数。lambd必须是大于0的浮点数。
  • vonmisesvariate(mu, kappa)函数用于生成一个符合冯·米塞斯(Von Mises)分布的随机浮点数。
  • gammavariate(alpha, beta)函数用于生成一个符合伽马(Gamma)分布的随机浮点数。
  • betavariate(alpha, beta)函数用于生成一个符合贝塔(Beta)分布的随机浮点数。
  • paretovariate(alpha)函数用于生成一个符合帕累托(Pareto)分布的随机浮点数。
  • paretovariate(alpha, beta)函数用于生成威布尔(Weibull)分布的随机数。

内容比较多,欢迎大家点赞收藏后学习。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科雷learning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值