Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:王琳茗 (中山大学)
邮箱:wanglm2326@outlook.com
目录
很多游戏都会设置类似 “开箱” 的环节:比如《炉石传说》里,玩家打开一个卡包,可以获得特定卡牌库中的 5 张卡牌。但究竟是沉睡者伊瑟拉还是鱼人宝宝 (卡牌名称),则完全取决于玩家的运气,或者说计算机生成的随机数。
作为人类,我们或许可以随口说出一串数字。但是计算机并不能 “随口”,它必须有一个科学稳定的随机数来源,才能得到随机数。我们将这个来源称为随机数生成器 (Random number generators,RNG)。常见的随机数生成器有三种:
随机数表法需要占用大量存储空间,现在已经很少被采用。这里,我们主要介绍前两种方法:真随机数生成器与伪随机数生成器。
第一个真随机数生成器诞生于 1955 年,由我们上文提到的 Rand 公司创造。在 1999 年,Intel 发布 Intel810 芯片组时,就配备了硬件随机数发生器,原理是电阻和振荡器生成的热噪声。目前,大部分芯片厂商都集成了硬件随机数发生器,使用非常方便,而一系列为科研和信息安全设计的真随机数发生器也层出不穷。
振荡器采样:如上文中提到的 Intel810RNG 芯片,利用热噪声 (由导体中电子的热震动引起的) 放大后,影响一个由电压控制的振荡器,再通过另一个高频振荡器来收集数据,得到随机数。在 Intel 815E 芯片组的个人电脑上安装 Intel Security Driver (ISD) 后,就可以通过编程读取寄存器获取 RNG 中的随机数。
直接放大电路噪声:直接以热噪声等电路噪声为随机源,通过运算放大,统计一定时间内达到阈值的信号数以此来得到随机数。
电路亚稳态:2010 年,德国研究团队开发出一种真随机数发生器,它使用的计算机内存双态触发器作为随机的一个额外层,触发器可随机的在 1 或 0 状态中切换。在切换之前,触发器处于行为无法预测的 “亚稳态”。在亚稳态结束时,内存中的内容为完全随机。研究人员对一个触发器单元阵列的实验显示,这种方法产生的随机数比传统方法 “随机” 约 20 倍。
混沌电路:混沌电路的输出结果对初始条件很敏感,不可预测,且在 IC 芯片中易集成,可产生效果不错的真随机数。
如果你还记得薛定谔那只可怜的猫,你应该知道:在我们打开盒子前,这只猫同时处于两种状态,猫既是死的也是活的。这听上去像是一个悖论,然而微观世界的物理规则确确实实是这样的。微观世界粒子的空间分布和动量是完全不确定的 (即量子力学的不确定性原理),从本质上讲就是真正随机的,因此很适合用来做 TRN。
当然,这并不是说基于经典宏观物理学的 TRNG 就不存在。例如,「RANDOM.ORG」网站从 1998 年开始,在线提供基于大气噪音生成的真随机数。以下是一些基于量子力学的真随机数生成器实例:
除了以上方法,真随机数的来源还可以是击键的间隔时间、鼠标移动速度、特定中断的时间间隔和块 IO 请求的响应时间等。
基于物理方法的 TRNG,生成的随机数无周期、不可预测、分布均匀。然而,这种随机数生成器技术要求高、生成效率低,难以满足计算机高速计算的需要。因此为了提高数据产生效率,TRNG 的结果往往被用作 PRNG 种子值,并以此生成伪随机的输出序列。
线性同余生成器 (linear congruential generators,LCGs) 是一种很常见的 PRNG,在很多编程语言中都有应用,如 Java 的 java.util.Random 类就是基于这种方法。该方法由 Lehmer (1951) 提出:给定非负整数
模数符号
我们可以从中看到伪随机数生成器的两个特点:
伪随机数由种子值决定:给定合适的
值得一提的是,目前 90% 的游戏都是使用内置时钟的时间作为种子值的。当你开箱时,程序会记录你按键时的时间,比如 12 点 34 分 17.745395 秒,使用小数点后的三四位 53 作为种子值。因此,当你总是开出 “蓝天白云” (稀有度很低的卡牌) 时,不妨换个时间试试。
伪随机数是周期性的:因为整数
从而限制了最大周期
梅森旋转算法 (Mersenne twister) 由松本真和西村拓士 (1997) 提出,其周期可达到
该方法目前在各种编程语言和库中已普遍存在或作为默认的伪随机数生成器。在 Stata 中,runiform()
函数是所有随机数生成函数的基础,其默认使用的就是 64 位梅森旋转算法。梅森旋转算法主要分为 3 步:
由于梅森旋转法的过程要比线性同余法复杂得多,此处就不详细展开,有兴趣可以阅读 Matsumoto 和 Nishimura (1998)。
如上文所提到,Stata 使用 64 位梅森旋转算法作为默认的随机数发生器。Stata 可以据此生成符合给定分布的伪随机数。
在 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. }
其他分布的随机数,一般都可在均匀分布随机数的基础上,通过适当变换生成。对于任意给定的连续型随机变量,若分布函数
对于任意给定的离散型随机变量,若概率分布为
可以看出
Stata 很贴心的内置了很多随机数函数 (几乎所有典型分布都有覆盖),使得我们大多数情况下并不需要 “对
注:除下文列出的一些典型内置函数外,更详细的内容可以通过 help random
命令查看。
rbinomial(n, p)
rhypergeometric(N, K, n)
rpoisson (m)
具体代码如下:
. 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)
rnormal(m, s)
rexponential(b)
rchi2(df)
rt(df)
具体代码如下:
. clear
. set obs 10000
. * 标准正态分布的随机数序列
. gen rn = rnormal()
. * 指数分布 Exp(10) 的随机数序列
. gen re = rexponential(10)
. * 自由度为 10 的卡方分布的随机数序列
. gen rc = rchi2(10)
. * 自由度为 5 的 t 分布的随机数序列
. gen rt = rt(5)
Note:产生如下推文列表的 Stata 命令为:
lianxh 随机, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh