random库的使用

目标
  • 能够利用随机数种子产生“确定”随机数
  • 能够产生随机整数
  • 能够对序列进行随机操作
random库概述

random库是使用随机数的Python标准库

伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素

random库包括两类函数,常用共8个:

  • 基本随机数函数
    seed()
    random()
  • 扩展随机数函数
    randint()
    getrandbits()
    uniform()
    randrange()
    choice()
    shuffle()
    sample()
基本随机函数
  1. seed(a=None) —— 初始化给定的随机数种子,默认为当前系统时间

    >>> import random
    >>> random.seed(10)
    
  2. 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
    
扩展随机数函数
  1. randint(a,b) —— 生成一个[a,b]之间的整数

    >>> random.randint(1,100)
    74
    
  2. randrange(m,n[,k]) —— 生成一个[m,n)之间以k为步长的随机整数

    >>> random.randrange(10,100)
    64
    >>> random.randrange(10,100,10)
    80
    
  3. getrandbits(k) —— 生成一个k比特长的随机整数

    >>> random.getrandbits(16)
    30315
    
  4. uniform(a,b) —— 生成一个[a,b]之间的随机小数

    >>> random.uniform(1,2)
    1.81332125135732
    >>> random.uniform(10,100)
    84.1229985280101
    
  5. choice(seq) —— 从序列seq中随机选择一个元素

    >>> random.choice([1,2,3,4,5,6,7,8,9])
    3
    
  6. 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]
    
  7. 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]
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值