Algorithm 伪随机变量

Algorithm 伪随机变量,algorithm,random,Algorithm,Random,我有一个介于0和1之间的变量,它决定了第二个变量(介于0和1之间的随机数)大于0.5的可能性。换句话说,如果我要生成第二个变量1000次,平均值应该大约等于第一个变量的值。如何生成此代码 哦,第二个变量在任何情况下都应该能够产生0或1,只是或多或少取决于第一个变量的值。下面是一个示例,它大致模拟了我希望程序的行为。每个方程代表第一个变量的一个单独值。您可以使用虚拟变量来实现这一点。首先将第一个变量设置为介于0和1之间的值。然后在假人中创建一个介于0和1之间的随机数。如果该虚拟变量大于第一个变量,

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


哦,第二个变量在任何情况下都应该能够产生0或1,只是或多或少取决于第一个变量的值。下面是一个示例,它大致模拟了我希望程序的行为。每个方程代表第一个变量的一个单独值。

您可以使用虚拟变量来实现这一点。首先将第一个变量设置为介于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。

我对这个问题提出了一种伪解决方案,我认为这是可以接受的

这是我做的算法

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

b = random.random()
b = b^(1/(2^(4*a-1)))
它实际上并没有产生我想要的平均结果,但对于我的目的来说已经足够接近了

编辑:我制作了一个包含大量数据点的程序,我使用这个算法用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))

表中的每个点是算法随机生成的100000个点的结果;它们的x位置是给定的a值,y位置是它们的平均值。理想情况下,它们适合于一条y=x的直线,但正如您所见,它们更适合于arctan方程。我正试图搞乱算法,使平均值符合直线,但我到目前为止运气不太好。

您有一个变量
p
,您正在寻找一个映射函数
f(x)
,该函数将[0,1]中的
x之间的随机滚动映射到相同的间隔
[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)

我尝试了一些与x^(1/(2^y))相关的东西,其中x是第一个变量,y是第二个变量。但我有点被困在那里,一段时间没有取得多大进展。你说的可能性是什么?如果var1是1,var2将大于0.5,如果var1是0,var2将不大于0.5?这是一个代表我一直在努力解决的问题的图表;每个方程代表第一个变量的不同值,x轴代表第一个变量的每个值的平均可能结果。还有,西蒙,你为什么删除我问题中关于所需算法范围的部分?根据下面的答案,人们显然对这方面感到困惑。我的编辑只添加了“算法”标签,没有删除任何内容。您可能想回顾一下,
yield
关键字的唯一功能是它在Python中的使用,它以增量方式为惰性迭代器返回项。这种用法在这里没有意义,所以我不确定你在这里的意思。而且,这似乎是解决问题的一种资源密集型方法。我想用指数法来修改一个正态分布的随机数,增加或减少它的值。我认为它不应该消耗那么多的cpu周期来生成一个额外的随机数。我记得有一次,有人演示了C或C++中的随机RNG的设置很长一段时间,但是只有6个CPU周期才能得到一个数字。我怀疑你能用一些数学结构做得更好。除此之外,你是如何定义你的算法的,它将为0到1之间的a生成0.25到0.75之间的平均值。请重新阅读我的主要帖子,我已经包含了一些关于我希望算法如何工作的更多信息。我的上帝之子,你已经做到了。我不知道你到底是怎么做到的,但它工作得完美无缺。也许我应该多学微积分和概率,这样我就不必发那么多愚蠢的帖子了。