Python基础 random 模块

random模块 python 中获取随机数的模块.

列出几个常用函数

import random
  • random.random()随机一个 0-1直接的浮点数,闭区间,不包括0和1 永远是 0.*****
>>> ret1 = random.random()   # (0,1)
print(ret1)  #0.9171884476077912
>>> ret2 = random.random()   # (0,1)
print(ret2)  #0.41349076378970284
  • random.randint(a,b)随机获取一个 a-b区间的整数,开区间. 包括a和b
>>> ret1 = random.randint(100,200) 
print(ret1)   #112
>>> ret2 = random.randint(100,200) 
print(ret2)   #186
  • random.randrange(a,b,k)随机获取一个a-(b-1)区间的整数(range顾头不顾尾),k为相隔的个数,1:不隔数;2:隔一个取一个;3:隔两个取一个....
>>> ret1 = random.randrange(1,20,2) # 获取一到20直接的奇数(最大19最小1)
print(ret1)  # 15

>>> ret2 = random.randrange(1,20,1) # 获取一到20直接的整数
print(ret2)  # 4
  • random.shuffle(x, random=None)打乱顺序,如发牌
>>> lst = [1,2,3,4,5,6,7]
>>> random.shuffle(lst)
print(lst) # [4, 6, 7, 1, 5, 2, 3]

>>> l = ['a','b,''c','d','e','f']
>>> random.shuffle(l)
print(l)  #['f', 'd', 'b,c', 'a', 'e']
  • random.choice()随机抽取一个
>>> ret = random.choice([1,2,'a','f',[1,2,3]])
print(ret) # 2

>>> ret = random.choice([1,2,'a','f',[1,2,3]])
print(ret) # [1,2,3]
  • random.sample(l, k)随机抽取多个值,k要小于l的长度,返回由k个元素组成新的列表
>>> ret = random.sample([1,2,'a','f',5,[1,2,3]],2)
print(ret) #[5,1]
>>> ret1 = random.sample([1,2,'a','f',5,[1,2,3]],2)
print(ret1) #['a', [1, 2, 3]]

  • 生成随机验证码 纯数字 或 数字➕字符
import random

def code(n=4,alpha=True):              # 默认4位,有字符的验证码
    s = ''
    for i in range(n):
        num = random.randint(0, 9)     
        if alpha:                                   #判断是否纯数字
            alpha_lower = chr(random.randint(97,122))   #得到一个随机的小写字母
            alpha_upper = chr(random.randint(65,90))    #得到一个随机的大写字母
            num = random.choice([num,alpha_upper,alpha_lower])  #随机返回一个
        s += str(num) #拼接
    return s

>>> ret = code()
print(ret)
>>> ret = code(6)
print(ret)
>>> ret = code(alpha=False)
print(ret)
>>> ret = code(6,False)
print(ret)

结果

xTLK
WZ3Ii1
3495
938403
  • 发红包 拼手气红包

  • 200元 10个 每个人抢到的钱都是随机的

  • 每一个人抢到多少钱的概率都平均

    先看下图,其实是一个比较简单的数学问题:


    self

    图上的意思是这样的:

n个人,随机获取n-1不重复的0-200之间的整数,然后对这些数排序,因为他肯定会在0-200的范围内,所有把这些值在0-200之间标注出来后,就相当于把0-200是分成了n段(加上头和尾的数是n+1个数,n段),这样每一段就是每个人随机抢到的红包数,再把每一段的值相加肯定为200。这样思路是不是就通了,每个人获得多钱的概率是一样的,上图最后一个人随机抢到了104 ,也是运气爆表. 下面来写代码:

import random

def za_send_RedEnvelope(money,n):
    lst = []
    #随机获取n-1个不重复的整数
    ret = random.sample(range(1,money),n-1)
    #对随机数排序
    ret.sort()
    #插入头0和尾部最大值money
    ret.insert(0,0)
    ret.append(money)
    #用后一个数减去前一个数,获取每个人的红包数
    for i in range(len(ret)-1):
        val = ret[i+1]-ret[i]
        lst.append(val)
    return lst

>>> ret =  za_send_RedEnvelope(200,10)
print(ret)            #[5, 9, 9, 69, 3, 20, 29, 30, 23, 3]
print(sum(ret))       #200

上面代码可以看到,得到的十个整数,相加是200,但是实际发红包的时候,最小的应该是1分钱而不是上面的1块钱.下面我们把单位换算一下,1块钱=100分钱,所以代码改成下面的样子(不要直接使用flost因为经常会算错的,直接换算单位是最准确的做法):

import random

def za_send_RedEnvelope(money,n):
    lst = []
    #把money换算成分   1 块钱 = 100分钱
    money = money * 100
    #随机获取n-1个不重复的整数
    ret = random.sample(range(1,money),n-1)
    #对随机数排序
    ret.sort()
    #插入头0和尾部最大值money
    ret.insert(0,0)
    ret.append(money)
    #用后一个数减去前一个数,获取每个人的红包数
    for i in range(len(ret)-1):
        val = ret[i+1]-ret[i]
        val = val / 100  #换算单位
        lst.append(val)
    return lst
ret =  za_send_RedEnvelope(200,10)
print(ret)
print(sum(ret))

我刷新了好几次结果如下:

[15.58, 73.6, 13.95, 6.21, 22.45, 0.13, 21.01, 8.19, 24.95, 13.93]
199.99999999999997

[41.51, 15.06, 6.48, 29.64, 5.26, 12.15, 27.97, 9.56, 3.12, 49.25]
200.0

[0.59, 23.46, 50.58, 0.34, 9.13, 14.65, 8.0, 31.43, 5.08, 56.74]
200.00000000000003

上面显示不是200的结果,是因为小数以二进制形式表示时的有穷性导致的.这个问题,就不在这里说了,可以搜索下decimal模块自己去了解下怎么解决这种问题 .
计算机的内存、cpu寄存器等等这些硬件单元都是有限的,只能表示有限位数的二进制位,因此存储的二进制小数就会和实际转换而成的二进制数有一定的误差。这个不是python 的问题,所有基于二进制的浮点数都会有这个问题,原因在于大部分浮点数转换为二进制后都是无限循环小数,而浮点数不可能用无限大的内存来储存,所以会有舍入的误差

可以去加一下结果肯定是200.

还有一个场景,因为是抢红包,所有这些数据应该不是一次性全放到内存中去,应该是拿一个取一个,所有这里应该要变成生成器更好一点代码如下:

import random

def za_send_RedEnvelope(money,n):
    #把money换算成分   1 块钱 = 100分钱
    money = money * 100
    #随机获取n-1个不重复的整数
    ret = random.sample(range(1,money),n-1)
    #对随机数排序
    ret.sort()
    #插入头0和尾部最大值money
    ret.insert(0,0)
    ret.append(money)
    #用后一个数减去前一个数,获取每个人的红包数
    for i in range(len(ret)-1):
        val = ret[i+1]-ret[i]
        val = val / 100  #换算单位
        yield val

ret =  za_send_RedEnvelope(200,10)
print(ret)
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print('-'*100)
print('生成器取完值:',sum(ret))

结果如下:

<generator object za_send_RedEnvelope at 0x103697318>

11.68
28.39
23.63
35.17
53.03
19.83
8.35
6.79
1.1
12.03
----------------------------------------------------------------------------------------------------
生成器取完值: 0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 基于《Python语言程序设计基础(第2版)》 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 ...
    柄志阅读 27,355评论 4 44
  • random 模块主要包含生成伪随机数的各种功能变量和函数。 在 Python 的交互式解释器中先导入 rando...
    帅帅滴小哥哥阅读 568评论 0 1
  • 我们可以先来了解下伪随机数和真随机数的概念。 伪随机数:伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机...
    a479a910abe7阅读 2,480评论 0 0
  • 我曾经遇到过一位举止粗鲁的同事,说话嗓门超大,对人很不客气,经常一副恨不得跟人打一仗的架势。说实在话,与这样的人相...
    馨月君阅读 1,163评论 0 1
  • 今天上午开始上了生物的第一节课,我发现自己还有知识点缺失的地方。 中午买和贤贤吃完茄子盖浇饭之后去买了阿华田,...
    叶儿花阅读 92评论 0 0