Python random 模块小记

概述

该模块为多种分布实现伪随机数生成器。

对于整数,在某范围内均匀选择。 对于序列,对随机元素均匀选择,通过产生随机排列就地生成列表以及用于随机抽取而不进行替换的功能。

Bookkeeping 函数

random.seed(a=None, version=2)

初始化随机数字产生器
如果省略a或None,则使用当前系统时间。 如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参阅os.urandom()函数)。
如果a是int, 则直接使用
使用版本2(默认值),str,bytes或bytearray对象将被转换为int,并使用其所有位。
使用版本1(提供用于从旧版本的Python重现随机序列),str和字节的算法产生较窄的种子范围。

random.getstate()

返回捕获当前生成器内部状态的对象。这个对象可以通过setstate()恢复状态

random.setstate(state)

状态应该是从之前的函数调用getstate()获得的,而setstate()将生成器的内部状态恢复到当时调用getstate()的状态。

Functions for integers

random.randrange(stop) / random.randrange(start, stop, [, step])

返回一个从range(start, stop, step)随机抽取的元素. 这个相当于choic(range(start, stop, step)), 但实际上并不构建range对象
位置参数与range()函数相匹配. 不应该使用关键词参数,因为函数可能会以不寻常的方式使用他们

random.randint(a, b)

返回一个随机的数字N, a <= N <= b. 函数相当于randrange(a, b + 1)

Functions for sequences

random.choice(seq)

从非空序列seq返回随机元素。 如果seq为空,则引发IndexError。

random.shuffle(x[, random])

随机打乱序列x, 会改变x本身.

random.sample(population, k)

返回从序列或集合中选择的K长度的list, list中元素唯一。 用于随机抽样,但不会替换本身
返回一个新列表,其中包含来自population的元素,同时保持原始population不变。 所得到的列表处于选择顺序,使得所有子片段也将是有效的随机样本。 这允许抽奖优胜者(样本)被划分为大奖和第二名获奖者(下级)。
population不需要是可散列的或独特的。 如果population包含重复元素,则样本中每一个元素都可能会出现。
要从整数范围中选择一个样本,请使用range()对象作为参数。 这对于从很大的population进行抽样来说,特别快速,空间有效:sample(range(1000000), 60)
如果样本大小大于总体大小,则会引发ValueError。

分布函数

函数参数以分布方程中的相应变量命名,如通用数学实践中所使用的; 大多数这些方程可以在任何统计文本中找到。

random.random()

返回范围[0.0,1.0)中的下一个随机浮点数。

random.uniform(a, b)

返回一个随机浮点数N,若a <= b, 则返回的N会a <= N <= b, 若b < a, b <= N <= a
根据等式a +(b-a)* random()中的浮点舍入,终点值b可以包括也可以不包括在范围内。

还有一些分布函数没有整理出来,如果需要可以查阅文档.

应用

基本应用

>>> random.random()                      # Random float x, 0.0 <= x < 1.0
0.37444887175646646

>>> random.uniform(1, 10)                # Random float x, 1.0 <= x < 10.0
1.1800146073117523

>>> random.randrange(10)                 # Integer from 0 to 9
7

>>> random.randrange(0, 101, 2)          # Even integer from 0 to 100
26

>>> random.choice('abcdefghij')          # Single random element
'c'

>>> items = [1, 2, 3, 4, 5, 6, 7]
>>> random.shuffle(items)
>>> items
[7, 3, 2, 5, 6, 4, 1]

>>> random.sample([1, 2, 3, 4, 5],  3)   # Three samples without replacement
[4, 1, 5]

进阶

一个常见的任务是产生一个带加权比率的random.choice()

如果权重是小的整数比率,一个简单的技术是建立重复的样本population:

>>> weighted_choices = [('Red', 3), ('Blue', 2), ('Yellow', 1), ('Green', 4)]
>>> population = [val for val, cnt in weighted_choices for i in range(cnt)]
>>> population
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
>>> random.choice(population)
'Red'

更一般的方法是使用itertools.accumulate()权重排列在累积分布中,然后使用bisect.bisect()定位随机值:

>>> choices, weights = zip(*weighted_choices)
>>> choices
('Red', 'Blue', 'Yellow', 'Green')
>>> weights
(3, 2, 1, 4)
>>> import itertools
>>> cumdist = list(itertools.accumulate(weights))
>>> cumdist
[3, 5, 6, 10]
>>> x = random.random() * cumdist[-1]
>>> x
7.904737262461592
>>> import bisect
>>> choices[bisect.bisect(cumdist, x)]
'Green'

后记

目前对于Python随机用的不多,不过既然用到了,我还是整理了一下官方的文档,加油.

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

推荐阅读更多精彩内容

  • 最近在写个性化推荐的论文,经常用到Python来处理数据,被pandas和numpy中的数据选取和索引问题绕的比较...
    shuhanrainbow阅读 4,526评论 6 19
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,543评论 1 118
  • 按照用途分类出以下统计函数: AVEDEV 用途:返回一组数据与其平均值的绝对偏差的平均值,该函数可以评测数据(例...
    四方院祭司阅读 2,856评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 今天本来就是打算休息的,况且我这核桃眼也不宜见人,吃了外卖后牙就叫我睡觉去。期间鹿丸打电话约球,我只能拒绝了,问他...
    觋离阅读 299评论 0 0