伪随机变量
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)
我有一个介于 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)