伪随机变量

Psuedo-Random Variable

我有一个介于 0 和 1 之间的变量,它应该指示 可能性 第二个变量(介于 0 和 1 之间的随机数)大于 0.5。换句话说,如果我要生成第二个变量 1000 次,平均值应该大约等于第一个变量的值。如何制作此代码?

哦,第二个变量应该总是能够在任何条件下产生 0 或 1,只是或多或少取决于第一个变量的值。这是一个 link to a graph 模型,它大致模拟了我希望程序的行为方式。每个等式代表第一个变量的单独值。

您可以使用假人来做到这一点。首先将第一个变量设置为 0 到 1 之间的值。然后在虚拟变量中创建一个 0 到 1 之间的随机数。如果这个虚拟变量大于第一个变量,则生成一个 0 到 0.5 之间的随机数,否则生成一个介于 0.5 和 1 之间的数字。

在伪代码中:

real a = 0.7
real total = 0.0
for i between 0 and 1000 begin
  real dummy = rand(0,1)
  real b
  if dummy > a then
    b = rand(0,0.5)
  else
    b = rand(0.5,1)
  end if
  total = total + b
end for
real avg = total / 1000

请注意,此算法将生成介于 0.25 和 0.75 之间的平均值。对于 a = 1,它只会生成介于 0.5 和 1 之间的随机值,其平均值应为 0.75。对于 a=0,它将仅生成 0 到 0.5 之间的随机数,其平均值应为 0.25。

我对这个问题做了一种伪解,我认为是acceptable。

这是我做的算法;

a = 0.2 # variable one
b = 0 # variable two

b = random.random()
b = b^(1/(2^(4*a-1)))

它实际上并没有产生我想要的平均结果,但对于我的目的来说已经足够接近了。

编辑:Here's a graph 我制作的包含大量数据点,我使用此算法通过 python 脚本生成;

import random

mod = 6
div = 100

for z in xrange(div):
    s = 0
    for i in xrange (100000):
        a = (z+1)/float(div) # variable one

        b = random.random() # variable two
        c = b**(1/(2**((mod*a*2)-mod)))
        s += c
    print str((z+1)/float(div)) + "\t" + str(round(s/100000.0, 3))

table中的每个点都是算法随机生成的100000个点的结果;他们的 x 位置是给定的值,他们的 y 位置是他们的平均值。理想情况下,它们适合 y = x 的直线,但如您所见,它们更接近反正切方程。我试图搞乱算法,使平均值符合这条线,但到目前为止我还没有太多运气。

你有一个变量 p,你正在寻找一个映射函数 f(x),它将 x in [0, 1] 之间的随机滚动映射到相同的间隔 [0, 1],这样预期值,即所有滚动的平均值,是 p.

您选择了函数原型

f(x) = pow(x, c)

其中 c 必须选择得当。如果x均匀分布在[0, 1]中,平均值为:

int(f(x) dx, [0, 1]) == p

积分:

int(pow(x, c) dx) == pow(x, c + 1) / (c + 1) + K

一个获得:

c = 1/p - 1

另一种方法是使 p 分布的中值,这样一半的卷落在 p 以下,另一半在 p 以上。这会产生不同的分布。 (我知道你没有要求。)现在,我们必须满足条件:

f(0.5) == pow(0.5, c) == p

产生:

c = log(p) / log(0.5)

使用当前的函数原型,您无法同时满足这两个要求。您的函数也是不对称的 (f(x, p) != f(1-x, 1-p))。

Python 功能如下:

def medianrand(p):
    """Random number between 0 and 1 whose median is p"""

    c = math.log(p) / math.log(0.5)
    return math.pow(random.random(), c)

def averagerand(p):
    """Random number between 0 and 1 whose expected value is p"""

    c = 1/p - 1
    return math.pow(random.random(), c)