【发布时间】:2017-07-11 01:01:49
【问题描述】:
我想知道如何使用“基本操作”对随机变量进行建模。我知道的唯一随机函数,至少对于 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 是非理性的,我会用rand() 近似得到1/pi 的概率,如果我从0 到Round(RAND_MAX*1/pi) 得到int,则选择X=1。所以这大约是两次,一次用于pi,另一次用于舍入。
有没有更好的方法?如何对更复杂的东西进行建模,例如在区间(0,infinity) 上的连续随机变量或在可数无限集上具有非理性概率的离散随机变量。我的方法是否仍然有效,还是我必须担心舍入错误?
编辑:另外,rand() 的伪随机性而不是随机性如何改变事物,我将如何解释这些变化?
【问题讨论】:
-
“然后我可以使用 mod 获取某个范围内的 int。” 不。您必须除法,而不是使用 mod,因为您只会使用随机性较小的低位。
-
@spectras 不保证
rand的质量。因此,没有指定低位或高位是否“更随机”。事实上,如果您需要任何类型的真正随机分布,rand是不可行的。哦,除非输入范围是除数的整数倍,否则 div 和 mod 都不合适。 -
我觉得这个问题或多或少值得一讲,作为它的答案。这没有错,并且有过这样的讲座的史诗案例,但它也(字面上)提出了很多要求。 :)
-
@olaf> 虽然你是对的,但在很多情况下,你通过除法获得的质量或多或少是可以接受的,而使用改装绝对不是。比如,小范围内的随机整数,比如 {0, 1, 2}。修改可以让您获得 [½, ¼, ¼] 的概率。划分不会完美,但仍然更接近 [⅓, ⅓, ⅓]。足够接近,您可以接受它,具体取决于用例。
-
@KamiKaze:我只是想添加一些信息(确实可以是
unsigned int,只是带有正的int范围)。您的其余评论都很好。
标签: c random probability