目标
- 能够利用随机数种子产生“确定”随机数
- 能够产生随机整数
- 能够对序列进行随机操作
random库概述
random库是使用随机数的Python标准库
伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素
random库包括两类函数,常用共8个:
- 基本随机数函数
seed()
random() - 扩展随机数函数
randint()
getrandbits()
uniform()
randrange()
choice()
shuffle()
sample()
基本随机函数
-
seed(a=None) —— 初始化给定的随机数种子,默认为当前系统时间
>>> import random >>> random.seed(10)
-
random() —— 获得[0,1)内的随机小数
>>> import random >>> random.seed(10) >>> random.random() 0.5714025946899135 >>> random.random() 0.4288890546751146 >>> random.seed(10) >>> random.random() 0.5714025946899135 >>> random.random() 0.4288890546751146
扩展随机数函数
-
randint(a,b) —— 生成一个[a,b]之间的整数
>>> random.randint(1,100) 74
-
randrange(m,n[,k]) —— 生成一个[m,n)之间以k为步长的随机整数
>>> random.randrange(10,100) 64 >>> random.randrange(10,100,10) 80
-
getrandbits(k) —— 生成一个k比特长的随机整数
>>> random.getrandbits(16) 30315
-
uniform(a,b) —— 生成一个[a,b]之间的随机小数
>>> random.uniform(1,2) 1.81332125135732 >>> random.uniform(10,100) 84.1229985280101
-
choice(seq) —— 从序列seq中随机选择一个元素
>>> random.choice([1,2,3,4,5,6,7,8,9]) 3
-
shuffle(seq) —— 将序列seq中元素随机排列,返回打乱后的序列,修改原件
>>> s = [1,2,3,4,5,6,7,8,9] >>> random.shuffle(s) >>> print(s) [1, 9, 3, 8, 7, 4, 2, 6, 5]
-
sample(k, n) —— 从 序列 或 集合 k中随机抽取n个样本
>>> import random >>> d = ['8','1','2','5','3'] >>> random.sample(d,3) ['8', '1', '5'] >>> d = '123456' >>> random.sample(d,2) ['3', '2'] >>> m = {'6', '2', '4', '3', '1', '5'} >>>> random.sample(m,3) ['6', '4', '5']
实例
-
圆周率的计算
除了常规的公式法,还可以采用蒙特卡罗方法。
思想:撒点。
1.将正方形与其内切圆四等分。
2.向其中一块撒点。
3.四分之一圆的面积S1=(pi*r²)/4,四分之一正方形面积S2=r²
4.pi = 4 * (S1/S2)
from random import random from time import perf_counter DARTS = 10000*10000 # 采样点越多,结果越接近真实值 start = perf_counter() hits = 0.0 for i in range(1,DARTS+1): x, y = random(), random() r = pow(x**2 + y**2, 0.5) if r <= 1.0: hits += 1 pi = 4 * (hits/DARTS) print("pi={}".format(pi)) print("运行时间是:{:.5f}s".format(perf_counter()-start))
-
模拟发红包
import random def hongbao(total, num): # total 表示红包总金额 # num 表示红包数量 each = [] # 已发红包总金额 already = 0 for i in range(1, num): # 为当前抢红包的人随机分配金额 # 至少给剩下的人每人留一分钱 t = random.uniform(0.01, (total - already) - (num - i)/100) each.append(round(t, 2)) already = already+round(t, 2) # 剩余所有钱发给最后一个人 each.append(round(total-already, 2)) return each if __name__ == '__main__': total = eval(input()) num = eval(input()) # 模拟10次 for i in range(10): each = hongbao(total, num) print(each)
运行结果
20 10 [6.03, 4.05, 1.36, 7.2, 0.07, 0.49, 0.71, 0.02, 0.02, 0.05] [15.34, 1.27, 1.79, 0.35, 0.54, 0.45, 0.06, 0.03, 0.09, 0.08] [8.79, 2.46, 7.51, 1.01, 0.09, 0.04, 0.05, 0.03, 0.01, 0.01] [7.15, 2.97, 0.35, 0.05, 7.92, 0.87, 0.62, 0.04, 0.01, 0.02] [1.63, 17.78, 0.24, 0.05, 0.08, 0.03, 0.15, 0.01, 0.02, 0.01] [13.27, 1.82, 1.91, 1.7, 0.23, 0.38, 0.34, 0.06, 0.04, 0.25] [16.48, 2.27, 1.1, 0.04, 0.03, 0.02, 0.01, 0.02, 0.01, 0.02] [4.45, 15.3, 0.11, 0.05, 0.04, 0.01, 0.01, 0.01, 0.01, 0.01] [19.37, 0.43, 0.06, 0.04, 0.04, 0.02, 0.01, 0.01, 0.01, 0.01] [3.28, 9.17, 5.39, 1.67, 0.3, 0.05, 0.02, 0.03, 0.01, 0.08]