我想知道如何使用“基本操作”为随机变量建模。我知道的唯一随机函数,至少对于C来说,是rand()
,以及用于播种的srand
。可能存在某些在线的软件包,但可以说我想自己实现它。我不知道是否还有其他非常常见的随机函数,但如果不是,只需坚持使用rand()
和C语言。如何模拟随机变量?
rand()
允许我从0
到RAND_MAX
伪随机生成int
。然后我可以使用mod
在某个范围内获得int
。我可以下mod 2
选择一个标志并获得负数。我也可以使用rand()/RAND_MAX
来模拟间隔(0,1)
中的值,并将其转换为Uniform(a,b)
。
但是我不确定的是,如果我可以扩展它来模拟任何概率分布,以及在什么时候我必须担心精度,特别是在处理无穷大和无理概率时。此外,这种方法非常粗糙,所以我想知道更多使用基本工具的标准方法(如果有的话)。
一个简单的例子:
我有随机变量X
使得Pr(X = 1)=1/pi
和Pr(X=0)=1-1/pi
。由于pi
不合理,因此我会近似得到1/pi
与rand()
的概率,并选择X=1
,如果我从0
获得int
到Round(RAND_MAX*1/pi)
。所以这是近似两次,一次为pi
,另一次为四舍五入。
有没有更好的方法?人们会怎样去模拟一些更复杂的事情,如间隔(0,infinity)
上的连续随机变量,或者一个离散的随机变量,它们在可数无限集合上具有无理概率。我的方法仍然有效吗?还是我不得不担心舍入错误?
编辑:另外如何伪随机性而不是随机性的0改变的事情,我将如何解释这些变化?
*“我可以使用mod在一定范围内获得int。”*不可以。你必须划分,而不是使用mod,因为你只会使用较低的位,而这些位较少随机。 – spectras
@spectras无法保证'rand'的质量。因此,不确定低位或高位是否“更随机”。事实是,如果你需要任何种类的真正的随机分配,“兰特”是一个不行。哦,除非输入范围是除数的整数倍,否则div和mod都不适用。 – Olaf
我觉得这个问题或多或少需要一个演讲作为答案。这并没有错,并且已经有这样的讲座史诗般的案例被传递,但它也(从字面上)要求很多。 :) – unwind