如何产生任意分布的随机数函数(如何产生任意分布的随机数的概率)
导语:如何产生任意分布的随机数
有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数。
由于电脑只能储存有限精度的数字,它产生的随机数必然出现循环周期,自然是伪随机数了。
而电脑生成的伪随机数就不一样了,它可以高效地生(伪)产(造)随机数,而且可以被再利用。
生产伪随机数的原理是非常非常简单的:
第一步:假设我们手头已经有一串数字,我们称它们为种子。对这些种子用递归法,“随机地(其实并不是)”生成一连串0到某个自然数N之间的自然数。
第二步:把这些随机生成的自然数转换成0到1之间的实数 (比如通过除以N来得到)。
第三步:利用这串“从零到一均匀分布的随机数”,把它们用某些算法来转换成其他分布的随机数。
随机数也可以自己编程产生。由于有一类函数,每次调用它执行时间有一定的随机性,利用此特性我们可以得到所需要的随机数。这些函数有Beep(0,0),MessageBeep()等。我们只要连续调用此类函数,获得其执行时间就可以达到产生随机数的目的。方法是通过获得该函数执行时间的时钟周期数。
随机数也可以通过具体电路产生,比如通过一个手动开关读出某个计数器中的数字。开关未接通时,计数器自动计数。每接通一次开关,读出一次数字,然后重置该计数器。由于计数器的初始数字一定,而手动开关的接通时间不确定,所以可以获得随机数。
所有上述方法产生的都是[0,1]上均匀分布的随机数,那如何由这些服从[0,1]上均匀分布的随机数来产生其它分布的随机数呢?
概率论中有如下定理:
已知随机变量X的分布函数F(x)是严格单调的连续函数, 证明Y=F(X)服从[0,1]上的均匀分布。
也就是说,当一个随机变量的分布函数严格单调时,如果再把这个分布函数视为一个随机变量,则这个随机变量服从[0,1]上的均匀分布。上述证明用到了一个函数如果是单调的,则其反函数和这个函数具有相同的单调性这一事实,证明如下:
有了上面的结论,现在就可以在计算机产生的服从[0,1]上的均匀分布的随机数的基础上,进一步产生我们需要的各种不同分布的随机数了。
由上图可以看出,F(x)严格单调,所以
本文内容由小葵整理编辑!