本文基于Python 3.6.5的官文random编写。

random模块简介

random为各种数学分布算法(distributions)实现了伪随机数生成器。

对于整数,是从一个范围中均匀选择(uniform selection);

对于序列,是从一个随机元素的均匀选择;

一个函数实现列表的随机排列(random permutation),是在列表本身实现了(in-place,改变了列表),而用于随机采样(random sampling)的函数则没有对列表本身进行更改。

On the real line(怎么翻译?),有函数计算均匀、正态(高斯)、对数正态、负指数、伽马和beta分布,对于产生角度分布,可以使用冯米泽斯分布。(原文引用如下,很遗憾,这些分布都忘记了,看来短期内很难去做ML、AI了啊,)

On the real line, there are functions to compute uniform, normal (Gaussian), lognormal, negative exponential, gamma, and beta distributions. For generating distributions of angles, the von Mises distribution is available.

几乎所有的模块函数都依然与基本函数random(),它用一种均匀的方式产生了一个位于半开区间[0.0, 1.0)(0 ≤ x < 1.0)的随机浮点数。Python使用 梅森转换(Mersenne Twister,是什么?)作为核心生成器(53位的浮点精度和2**19937 -1的period)。用C实现的底层是快速且线程安全的。梅森转换 是一个现存的经过了最广泛测试的随机数生成器。但是,由于其完全的确定性(being completely deterministic,是指random产生的随机数每一个可以推断出来吗?),它不适合于某系场景,并且完全不适合 加密 场景。

本模块提供的函数实际上都绑定到了一个random.Random的隐藏实例,开发者也可以自己实例化Random以获取不共享状态(share state,什么事state?)生成器。

类Random也可以被继承以便实现一个开发者自己设计出来的不同的基础生成器...(省略了)。

random还提供了SystemRandom类,这个类使用系统函数os.urandom()从操作系统提供的源去产生随机数。

警告:这个模块的伪随机数生成器不应该用作安全目的,对于安全和加密用途,可以参考secrets模块。

接下来将要介绍(罗列)random中的函数,包括:

-簿记函数(Bookkeeping functions)

-用于整数的函数

-用于序列的函数

-实值分别

-可替换的生成器

-关于重复问题的注意项

簿记函数

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

初始化随机数生成器。

random.getstate()

random.setstate(state)

random.getrandbits(k)

用于整数的函数

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

从range(start, stop, step)中随机选择一个元素返回。功能和choice(range(start, stop, step))相同,但不会制造构建一个range对象。

random.randint(a, b)

返回一个随机整数N,a ≤ N ≤ b。randrange(a, b+1)的别名。

用于序列的函数

random.choice(seq)

返回非空序列中的一个随机元素,如果seq是空,产生IndexError。

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

从population中选择k个元素组成列表并会改变population,如果population为空,产生IndexError。

3.6版本中新增加的函数,有一些复杂,尚未弄清楚。

官文示例:运行过示例后,了解到了函数中 权重 的概念了

random.shuffle(x[, random])

就地(in place)打乱一个序列x。参数random是一个无参数函数,返回一个[0.0, 1.0)的值,默认使用random()。

对于不可变序列,返回一个新的打乱了的序列,使用sample(x, k=len(x))替代。

random.sample(population, k)

从参数population(序列 或 集合)中选择k个元素(官文中的unique elements怎么翻译?)组成列表返回。用于随机采样,但不会改变population。

如果采样长度大于参数population的长度,产生ValueError。

示例:

实值分布

下面的函数用于生产指定的实值分布。函数参数 在 分布的方程式中相应的变量后面 添加名称,就像在一般的数学使用中一样,大部分方程式可以在统计学文本中找到。

简单示例如下:用起来挺简单的,但在哪里用,内在逻辑怎样就完全不知道了,

random.random()

返回下一个位于[0.0, 1.0)的随机浮点数。

random.uniform(a, b)

random.triangular(low, high, mode)

random.betavariate(alpha, beta)

random.expovariate(lambd)

random.gammavariate(alpha, beta)

random.gauss(mu, sigma)

random.lognormvariate(mu, sigma)

random.normalvariate(mu, sigma)

random.vonmisesvariate(mu, kappa)

random.paretovariate(alpha)

random.weibullvariate(alpha, beta)

可替换的生成器

class random.SystemRandom([seed])

和Random类并列,其替换函数。

使用os.urandom()函数创建随机数,其源由操作系统提供,但并非所有系统都支持。

不依赖于软件状态,序列是不可以重复制造的,因此,seed()方法是无效且被忽略的。

调用getstate()和setstate()方法会产生NotImplementError错误(源码显示,此类没有实现这两个函数)。

关于重复问题的注意项

有时候,能够重新制造由伪随机数生成器产生的序列是很有用的。通过复用种子数(seed value),在单个运行环境中(没有运行多线程),在相同的序列应该是可以重现的(翻译的意思可能对了,但大家还是看看下面的原文引用)。

the same sequence should be reproducible from run to run as long as multiple threads are not running.

大多数的 随机数模块的算法和种子函数(seeding functions) 会因为不同的Python版本而改变,但有两方面是可以保证的:

- 如果添加了新的种子方法(seeding method),那么一个向后兼容的seeder需要提供出来;

- 生成器的random()方法在给相同的种子到兼容的seeder时,会产生相同的序列。

后记

此文写的有些忧伤,它提醒孤很久之前是学过数学分布的,可是,现在几乎全部忘光光了。

对于上面的介绍了的函数,还是需要好好掌握的。

以后再次懂的数学分布了,再来完善此文。

在官文的末尾,还提到了一个用于统计学的模块statictics,有【机会】可以看看。

Python模块:Random(未完待续)的更多相关文章

  1. Python面试2未完待续

    Python面试重点(基础篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? c语言是编译型语言,运行速度快,但翻译时间长py ...

  2. [python]爬代理ip v2.0(未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  3. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  4. Day4-内置函数--未完待续,慢慢写

    内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 未完待续....

  5. Java开发中的23+2种设计模式学习个人笔记(未完待续)

    注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...

  6. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  7. 构建Linux根文件系统(未完待续)

          所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...

  8. asp.net面试题总结1(未完待续。。。。)

    1.MVC中的TempData\ViewBag\ViewData区别? 答:页面对象传值,有这三种对象可以传. Temp:临时的 Bag:袋子 (1)  TempData  保存在Session中,C ...

  9. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  10. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

随机推荐

  1. 【CF183D】T-shirt(动态规划,贪心)

    [CF183D]T-shirt(动态规划,贪心) 题面 洛谷 CodeForces 题解 \(O(n^2m)\)的暴力懒得写了,比较容易,可以自己想想. 做法是这样的,首先我们发现一个结论: 对于某个 ...

  2. BZOJ 3527 力 | FFT

    BZOJ 3527 力 | 分治 题意 给出数组q,$E_i = \sum_{i < j} \frac{q_i}{(i - j) ^ 2} - \sum_{i > j} \frac{q_i ...

  3. BZOJ 2724 蒲公英 | 分块模板题

    题意 给出一个序列,在线询问区间众数.如果众数有多个,输出最小的那个. 题解 这是一道分块模板题. 一个询问的区间的众数,可能是中间"整块"区间的众数,也可能是左右两侧零散的数中的 ...

  4. AC自动机【萌新文章】

    我这个蒟蒻第一次写博客,有点小激动呢. 主要是最近刚学了AC自动机,学得糟糟糕糕,记录一下,看到dalao们都在写博客,决定自己也写一波[我好水的啦,写的也不好] AC自动机大概就是    Trie+ ...

  5. 【poj1743】 Musical Theme

    http://poj.org/problem?id=1743 (题目链接) 题意 给出n个音符的乐谱,求其中不重叠的重复最长连续段,重复连续段的定义为两段音符起伏相同. Solution 论文题,相邻 ...

  6. Redis事务介绍

    概述 相信学过Mysql等其他数据库的同学对事务这个词都不陌生,事务表示的是一组动作,这组动作要么全部执行,要么全部不执行.为什么会有这样的需求呢?看看下面的场景: 微博是一个弱关系型社交网络,用户之 ...

  7. java整形中的缓存机制

      英文原文:Java Integer Cache 翻译地址:Java中整型的缓存机制 原文作者:Java Papers 翻译作者:Hollis 转载请注明出处. 本文将介绍Java中Integer的 ...

  8. Python之旅:并发编程之多线程理论部分

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  9. linux内核增加系统调用--Beginner's guide

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  10. 七、java数组

    目录 一.一维数组 声明方式 数组对象的创建 元素为引用数据类型的数组 数组初始化 数组元素默认初始化 数组元素的引用 二.二维数组 概念 初始化 二维数组举例 三.数组的拷贝 四.练习 数组可以堪称 ...