Stata 中常用的随机数生成方式及随机数生成器介绍

邮箱:wanglm2326@outlook.com

Stata 中常用的随机数生成方式及随机数生成器介绍

目录

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

3. 参考文献

4. 相关推文

请注意:微信平台不支持链接功能。您可以点击页面下方的“阅读原文”链接。另外,您也可以通过长按或扫描页面上的二维码,直接跳转至原文页面。

1. 随机数生成器介绍

众多游戏都设有类似“开箱”的环节,以《炉石传说》为例,玩家在打开一个卡包时,能够随机获得库中5张卡牌。然而,是沉睡者伊瑟拉还是鱼人宝宝(卡牌名称),这一切全凭运气而定,亦或是计算机随机生成的数字来决定。

作为人类,我们或许能轻松地念出一连串数字。然而,计算机却不能随意这么做,它需要依赖一个科学且稳定的随机数产生途径,才能生成随机数。我们把这个途径称作随机数生成器,简称RNG。随机数生成器主要分为以下三种类型:

随机数表法对存储资源的需求极大,因此其应用已较为罕见。在此,我们将重点阐述前两种技术:真实随机数发生器和模拟随机数发生器。

1.1 真随机数生成器

1955年,首个真正的随机数生成器问世,该设备由前文所述的Rand公司研发而成。到了1999年,当Intel公司推出Intel810芯片组时,该芯片组内置了硬件随机数生成功能,其工作原理基于电阻和振荡器产生的热噪声。目前,众多芯片制造商已将硬件随机数生成器整合其中,使用起来极为便捷;同时,针对科研与信息安全领域,各式各样的真随机数生成器亦接连涌现。

1.1.1 基于电路的 TRNG

Intel810RNG芯片的采样过程是这样的:首先,它通过放大由导体中电子热运动产生的热噪声;接着,这些噪声作用于一个受电压调节的振荡器;然后,再利用另一个高频振荡器来捕捉数据;最终,我们得到了一系列随机数。在装备了 Intel 815E 芯片组的个人电脑中,一旦成功部署了 Intel Security Driver(ISD),便能够通过编程手段访问寄存器,进而提取 RNG 产生的随机数值。

直接通过放大电路中的噪声:以热噪声及其他电路噪声作为随机信号的产生基础,借助运算放大器,对特定时间段内达到设定阈值的信号数量进行统计,从而生成随机数。

2010年,德国的研究团队成功研制了一种新型的真随机数生成器。该设备利用计算机内存中的双态触发器,将其作为产生随机数的额外机制。触发器能够在1和0两种状态之间随机转换。在转换动作发生之前,触发器会进入一种行为不可预测的“亚稳态”。而当亚稳态结束之际,内存中的数据便会呈现出完全随机的状态。实验结果表明,研究人员对触发器单元阵列进行的测试发现,此方法所生成的随机数在“随机性”方面,相较于传统方法高出大约20倍。

混沌电路的输出对初始状态极为敏感,难以预测,同时便于在集成电路芯片中实现,能够生成质量上乘的真随机数。

1.1.2 基于物理的 TRNG

若你尚能忆起薛定谔所提及的那只不幸的猫咪,那么你应当明白:在我们揭开盒盖之前,该猫同时存在于生与死的两种状态之中,它既已死亡,又依然存活。这情形似乎构成了一个悖论,但微观世界的物理法则确实如此。在微观层面,粒子的空间分布和动量处于完全的不确定性状态(即量子力学的不确定性原理),本质上表现为真正的随机性,因此特别适宜用于构建TRN。

当然,这并不意味着基于传统宏观物理学的真随机数生成器不存在。比如,「RANDOM.ORG」网站自1998年起,便在线上提供了基于大气噪声产生的真随机数服务。此外,还有一些基于量子力学的真随机数生成器实例可供参考。

1.1.3 基于其他因素的 TRNG

除此之外,真随机数的生成途径还包括按键操作的延迟、鼠标位移速率、特定中断发生的周期以及块输入输出请求的响应时长等因素。

1.2 伪随机数生成器

基于物理原理的随机数生成器,所产出的随机数值不具备周期性、难以预测且分布均匀。但是,此类随机数生成技术对性能要求较高、生成速度较慢,难以满足计算机在高速运算中对随机数的需求。鉴于此,为了提升数据生成的效率,通常将 TRNG 的输出结果作为伪随机数生成器(PRNG)的种子,进而产生一系列伪随机序列。

1.2.1 线性同余法

线性同余生成器,即LCGs,是一种广泛使用的伪随机数生成器,被众多编程语言采纳,例如Java中的java.util.Random类便采用了这一技术。Lehmer在1951年提出了这一方法:对于任意的非负整数a、b、c以及任意整数n,我们可以利用递归公式计算出一系列整数,这些整数构成了序列{d_n}。

模数符号所代表的是除法运算后剩余的部分。随后,我们将该数进行进一步的除法运算,从而生成一系列的伪随机数序列。

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

伪随机数的生成依赖于一个种子值,一旦确定了合适的种子值、参数以及初始状态,所得到的伪随机数序列便完全由这个初始值所决定。这个初始值被称作种子值。若种子值保持不变,那么所生成的随机数序列也将保持一致。这一特性是伪随机数的一个显著优势,即它允许我们重复执行相同的模拟过程。

值得关注的是,现在大约有九成游戏是以内置时钟所显示的时间作为随机数生成的依据。比如,在您开启宝箱的瞬间,系统会捕捉并记录下您按下的具体时刻,例如“12点34分17.745395秒”,然后从中提取小数点后第三四位数字“53”作为随机数的种子。这就意味着,如果您频繁地抽到“蓝天白云”(这种卡牌的稀有度相当低),不妨尝试调整一下开启宝箱的时间点。

伪随机数的生成呈现周期性特征,这主要是因为其整数部分是非负的,并且当以某个界限为基准时,伪随机数序列必然会在该界限所定义的周期内重复出现。为了确保在32位计算机上能够进行无舍入误差的浮点数运算,在以往,线性同余发生器的参数常常被设定为:

因此,最大周期受到了约束。周期性是所有伪随机数生成器共有的特点。为了解决这一问题,我们必须确保循环周期尽可能延长,使其超出我们可能使用的最长序列长度。

1.2.2 梅森旋转法

梅森旋转算法,亦称Mersenne twister,由松本真和西村拓士在1997年提出,其周期之长,竟超出可观测宇宙内粒子总数的预估,高出了上千个数量级。即便如此,周期之长并不直接等同于伪随机数的优质性,然而短周期的伪随机数却必定是不理想的。

此方法现已在众多编程语言及其库中广泛采用,或被设定为默认的随机数生成方式。在 Stata 软件里,runiform() 函数构成了所有随机数生成函数的根基,而它默认采用的正是64位的梅森旋转算法。梅森旋转算法主要包含三个步骤:,,。

启动初始状态:依据指定的起始值,通过执行位移、异或、乘法以及加法等运算步骤,连续构建出后续的多个状态,直至达到状态 ,并且这些状态的位数均为 。

根据现有状态,随机数的产生涉及位移、逻辑与以及异或等运算过程。

每当成功生成一定数量的随机数之后,系统会自动对当前状态进行更新,然后才会继续生成新的随机数。

梅森旋转算法示意图

梅森旋转法的操作相对线性同余法来说要繁复许多,因此在此不便详述,如欲深入了解,可参阅 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. 生成一个服从均匀分布的随机变量uni,通过调用runiform函数实现。
3. }

. // 每个随机数都设置相同的种子
. clear
. set obs 5
. forvalues i = 1/5 {
2. set seed 233
3. 生成一个均匀分布的随机数序列,命名为gen_unif,通过调用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) 的随机数序列
生成随机数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

专题:内生性-因果推断

专题:机器学习

全新推出!Stata搜索利器:连晓华与宋波亮

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

安装:

. ssc install lianxh

. ssc install songbl

使用:

. lianxh DID 倍分法

. songbl all

关于我们

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

25阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读