gpt4 book ai didi

c - 如何对随机变量建模?

转载 作者:太空狗 更新时间:2023-10-29 15:23:26 25 4
gpt4 key购买 nike

我想知道如何使用“基本操作”对随机变量建模。我知道的唯一随机函数,至少对于 C,是 rand(),以及用于播种的 srand。网上某个地方可能存在软件包,但可以说我想自己实现它。我不知道是否还有其他非常常见的随机函数,但如果没有,让我们坚持使用 rand() 和 C 语言。

rand() 允许我伪随机生成从 0RAND_MAXint。然后我可以使用 mod 获得某个范围内的 int。接下来我可以 mod 2 选择一个符号并得到负数。我还可以执行 rand()/RAND_MAX 来为区间 (0,1) 中的值建模,并将其转换为模型 Uniform(a,b).

但我不确定的是,我是否可以将其扩展到对任何概率分布建模,以及在什么时候我必须担心准确性,尤其是在处理无穷大和无理概率时。此外,这种方法非常粗糙,所以我想知道使用基本工具的更多标准方法(如果有的话)。

一个简单的例子:

我有随机变量 X 使得 Pr(X = 1)=1/piPr(X=0)=1-1/pi。由于 pi 是无理数,我会用 rand() 近似得到 1/pi 的概率并选择 X=1 如果我得到从 0Round(RAND_MAX*1/pi)int。所以这是两次近似,一次是 pi,另一次是舍入。

有更好的方法吗?如何对更复杂的事物建模,例如区间 (0,infinity) 上的连续随机变量或可数无限集上具有非理性概率的离散随机变量。我的方法是否仍然有效,或者我是否需要担心舍入误差?

编辑:此外,rand() 的伪随机性而不是随机性如何改变事物,我将如何解释这些变化?

最佳答案

I can then use mod to get an int in some range

不,你不能。用骰子试试。你想要一个介于 1 和 5 之间的数字。所以你采用 roll mod 5(实际上是 ((roll-1)%5)+1)。这将 1 映射到 1、2 映射到 2,等等。5 映射到 5 和 6 映射到 1。你现在得到 1 的可能性是任何其他掷骰的两倍。

这样做的正确方法是找到比您的范围最近的 2 的幂,屏蔽掉高于 2 的幂的随机数位,然后检查您是否在范围内。如果您不在范围内,请重试(可能会永远循环,实际上平均重试次数少于 2 次)。这假设您的随机数是比特流而不是其他东西。对于体面的生成器,这通常是一个安全的假设。

I can also do rand()/RAND_MAX to model values in the interval (0,1)

不,你不能。这不是 float 的工作原理。这会产生可怕的分布。

要么整数中的位数小于尾数中的位数,那么您将得到一堆永远无法生成的 float 。或者整数中的位数大于尾数中的位数,然后在除法之前将其转换为 float 时会截断整数,并且会更频繁地生成某些数字。

in the interval (0,1) and shift this to model Uniform(a,b).

这让事情变得更糟。首先,您在一个方向上丢失了比特,然后在另一个方向上丢失了比特。

实际生成任意范围内均匀分布的 float 比看起来要难。

几年前我自己做了一些实验来解决这个问题,在这个过程中学习了浮点内部原理,并且我在这里写了一些带有很多注释和推理的代码:https://github.com/art4711/random-double

简而言之,生成任意范围内的随机 float :找到范围内较大的绝对值。那是开始,范围的另一端是结束。从头到尾找出下一个可表示的数字。从开始减去下一个数字,即成为步骤。计算开始和结束之间存在多少步。生成一个介于 0 和步数之间的均匀分布的随机数。 start + step * 随机数就是答案。此外,由于 float 的工作方式,这可能不是您要查找的内容。使用此方法肯定不可能生成所有可能的浮点值(除非在非常特殊的情况下)。但是这种方法保证每个可能的值都是等可能的。

请注意,您的误解很常见。几乎每个人都会做这些事情。行业中的随机数绝不是随机的。计算机科学中的随机一词几乎意味着“可预测、可重复、容易破解和利用,很可能分布不均”。不要让我开始谈论标准库中“随机”数字生成器的质量。如果你深入了解我的 github 资料,你会发现一个 Go 的包,其中包含关于此的长篇自述文件。

我不会回答你剩下的问题,这些部分需要一两本书。

关于c - 如何对随机变量建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42366765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com