邮箱:wanglm2326@outlook.com

目录

2. Stata 中常用的随机数生成方式

3. 参考文献

4. 相关推文

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

1. 随机数生成器介绍

很多游戏都会设置类似 “开箱” 的环节:比如《炉石传说》里,玩家打开一个卡包,可以获得特定卡牌库中的 5 张卡牌。但究竟是沉睡者伊瑟拉还是鱼人宝宝 (卡牌名称),则完全取决于玩家的运气,或者说计算机生成的随机数。

作为人类,我们或许可以随口说出一串数字。但是计算机并不能 “随口”,它必须有一个科学稳定的随机数来源,才能得到随机数。我们将这个来源称为随机数生成器 (Random number generators,RNG)。常见的随机数生成器有三种:

随机数表法需要占用大量存储空间,现在已经很少被采用。这里,我们主要介绍前两种方法:真随机数生成器与伪随机数生成器。

1.1 真随机数生成器

第一个真随机数生成器诞生于 1955 年,由我们上文提到的 Rand 公司创造。在 1999 年,Intel 发布 Intel810 芯片组时,就配备了硬件随机数发生器,原理是电阻和振荡器生成的热噪声。目前,大部分芯片厂商都集成了硬件随机数发生器,使用非常方便,而一系列为科研和信息安全设计的真随机数发生器也层出不穷。

1.1.1 基于电路的 TRNG

振荡器采样:如上文中提到的 Intel810RNG 芯片,利用热噪声 (由导体中电子的热震动引起的) 放大后,影响一个由电压控制的振荡器,再通过另一个高频振荡器来收集数据,得到随机数。在 Intel 815E 芯片组的个人电脑上安装 Intel Security Driver (ISD) 后,就可以通过编程读取寄存器获取 RNG 中的随机数。

直接放大电路噪声:直接以热噪声等电路噪声为随机源,通过运算放大,统计一定时间内达到阈值的信号数以此来得到随机数。

电路亚稳态:2010 年,德国研究团队开发出一种真随机数发生器,它使用的计算机内存双态触发器作为随机的一个额外层,触发器可随机的在 1 或 0 状态中切换。在切换之前,触发器处于行为无法预测的 “亚稳态”。在亚稳态结束时,内存中的内容为完全随机。研究人员对一个触发器单元阵列的实验显示,这种方法产生的随机数比传统方法 “随机” 约 20 倍。

混沌电路:混沌电路的输出结果对初始条件很敏感,不可预测,且在 IC 芯片中易集成,可产生效果不错的真随机数。

1.1.2 基于物理的 TRNG

如果你还记得薛定谔那只可怜的猫,你应该知道:在我们打开盒子前,这只猫同时处于两种状态,猫既是死的也是活的。这听上去像是一个悖论,然而微观世界的物理规则确确实实是这样的。微观世界粒子的空间分布和动量是完全不确定的 (即量子力学的不确定性原理),从本质上讲就是真正随机的,因此很适合用来做 TRN。

当然,这并不是说基于经典宏观物理学的 TRNG 就不存在。例如,「RANDOM.ORG」网站从 1998 年开始,在线提供基于大气噪音生成的真随机数。以下是一些基于量子力学的真随机数生成器实例:

1.1.3 基于其他因素的 TRNG

除了以上方法,真随机数的来源还可以是击键的间隔时间、鼠标移动速度、特定中断的时间间隔和块 IO 请求的响应时间等。

1.2 伪随机数生成器

基于物理方法的 TRNG,生成的随机数无周期、不可预测、分布均匀。然而,这种随机数生成器技术要求高、生成效率低,难以满足计算机高速计算的需要。因此为了提高数据产生效率,TRNG 的结果往往被用作 PRNG 种子值,并以此生成伪随机的输出序列。

1.2.1 线性同余法

线性同余生成器 (linear congruential generators,LCGs) 是一种很常见的 PRNG,在很多编程语言中都有应用,如 Java 的 java.util.Random 类就是基于这种方法。该方法由 Lehmer (1951) 提出:给定非负整数 、、和 ,对于任意整数 ,我们都能通过递归公式得到一个整数 的序列:

模数符号 表示, 是 被 除后的余数。接着,我们将 除以 ,就得到了一个伪随机数 的序列:

我们可以从中看到伪随机数生成器的两个特点:

伪随机数由种子值决定:给定合适的 、、和 值后,得到的伪随机数序列完全取决于 ,这个初始值称为种子值 (seed value)。如果种子值不变,产生的随机数序列也不会变。这是伪随机数的优点之一:可以重复相同的模拟过程。

值得一提的是,目前 90% 的游戏都是使用内置时钟的时间作为种子值的。当你开箱时,程序会记录你按键时的时间,比如 12 点 34 分 17.745395 秒,使用小数点后的三四位 53 作为种子值。因此,当你总是开出 “蓝天白云” (稀有度很低的卡牌) 时,不妨换个时间试试。

伪随机数是周期性的:因为整数 是非负的,并且以 为界,伪随机数序列一定会在 的周期内循环。为了保证在 32 位计算机上实现无舍入的浮点数计算,在过去,LCG 的参数通常会被设置为:

从而限制了最大周期 。周期性是所有伪随机数生成器的特性。为了应对这一问题,我们需要使循环周期尽可能长,超过我们所可能用到的最长序列长度。

1.2.2 梅森旋转法

梅森旋转算法 (Mersenne twister) 由松本真和西村拓士 (1997) 提出,其周期可达到 ,比可观测宇宙内粒子总数的估计值 () 还要高出上千个数量级。尽管如此长的周期并不必然意味着高质量的伪随机数,但短周期一定不是好的伪随机数。

该方法目前在各种编程语言和库中已普遍存在或作为默认的伪随机数生成器。在 Stata 中,runiform() 函数是所有随机数生成函数的基础,其默认使用的就是 64 位梅森旋转算法。梅森旋转算法主要分为 3 步:

初始化 个状态:根据给定的种子点 ,通过移位、异或、乘法、加法等操作生成后续的 个状态 到 ,bit 位数为 ;

生成伪随机数:根据当前状态,通过移位、与、异或操作生成随机数;

更新 个状态:每生成 个随机数后,在生成下一个随机数前,更新状态。

梅森旋转算法示意图

由于梅森旋转法的过程要比线性同余法复杂得多,此处就不详细展开,有兴趣可以阅读 Matsumoto 和 Nishimura (1998)。

2. Stata 中常用的随机数生成方式

如上文所提到,Stata 使用 64 位梅森旋转算法作为默认的随机数发生器。Stata 可以据此生成符合给定分布的伪随机数。

2.1 生成服从均匀分布的随机数

在 Stata 中,用内置函数 runiform() 生成均匀分布随机数。在生成随机数前,可以通过 set seed # 命令设定随机数的种子值。具体代码如下:

. * 生成 5 个 U(0, 1) 的随机数序列
. // 每个序列包含 5 个随机数
. clear
. set obs 5
. forvalues i = 1/5 {
2. gen unif`i' = runiform()
3. }

. // 每个随机数都设置相同的种子
. clear
. set obs 5
. forvalues i = 1/5 {
2. set seed 233
3. gen unif`i' = runiform()
4. }

2.2 生成服从其他分布的随机数

其他分布的随机数,一般都可在均匀分布随机数的基础上,通过适当变换生成。对于任意给定的连续型随机变量,若分布函数 已知,则该随机变量的随机数可以通过 获得。其中 为 的随机数。即连续型随机变量的随机数可以通过对 求分布函数的逆运算获得。

对于任意给定的离散型随机变量,若概率分布为 ,则该随机变量的随机数同样可以通过对 求分布函数的逆运算获得。具体方式为:令 ,

可以看出 的概率分布为:

2.3 Stata 内置的随机数生成函数

Stata 很贴心的内置了很多随机数函数 (几乎所有典型分布都有覆盖),使得我们大多数情况下并不需要 “对 求分布函数的逆运算” 手动获得服从其他分布的随机数。

注:除下文列出的一些典型内置函数外,更详细的内容可以通过 help random 命令查看。

2.3.1 常见的离散型随机变量

具体代码如下:

. set obs 10000
. * 二项分布 B(5, 0.5) 的随机数序列
. gen rb = rbinomial(5, 0.5)
. * 超几何分布 H(10, 3, 5) 的随机数序列
. gen rh = rhypergeometric(10, 3, 5)
. * 泊松分布 Poisson(10) 的随机数序列
. gen rp = rpoisson(10)

2.3.2 常见的连续型随机变量

具体代码如下:

. clear
. set obs 10000
. * 标准正态分布的随机数序列
. gen rn = rnormal()
. * 指数分布 Exp(10) 的随机数序列
. gen re = rexponential(10)
. * 自由度为 10 的卡方分布的随机数序列
. gen rc = rchi2(10)
. * 自由度为 5 的 t 分布的随机数序列
. gen rt = rt(5)

3. 参考文献

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:

lianxh 随机, m

安装最新版 lianxh 命令:

ssc install lianxh, replace

专题:Stata程序

专题:IV-GMM

专题:倍分法DID

专题:内生性-因果推断

专题:机器学习

New! Stata 搜索神器:lianxh 和 songbl

搜: 推文、数据分享、期刊论文、重现代码 ……

安装:

. ssc install lianxh

. ssc install songbl

使用:

. lianxh DID 倍分法

. songbl all

关于我们

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: yjxmw518