好吧,这个窃听了我好几年了,现在。如果你吸入统计数据和较高数学在学校里,转身离去, 现在.太晚了。

好的。深吸一口气。这里的规则。拿 两个 第三十面骰子(是的, 他们确实存在)和滚动他们同时进行。

  • 添加两个数字
  • 如果两个骰子显示 <=5或>=26日再次抛出和 添加 结果你有什么
  • 如果一个人 <=5和其他>=26日再次抛出和 减去的 结果从什么 你必须
  • 重复,直到无论是>5和 < 26!

如果你写一些代码(见下文),滚的骰子的几百万倍,你最多久你会收到每个数字为最终结果,你会得到一个曲线相当平左1,约有45°度之间1和60和平面在上述60。有机会卷30.5或更好的是大于50%,比18 80%和滚比0为97%以上。

现在的问题:是否有可能编写的程序 计算确切的 值f(x),即概率以滚一定的价值?

背景:对于我们的角色扮演游戏"丛林之星"我们寻找一种方法,以保持随机事件在检查。上述规则确保一个更稳定成果对于你的东西尝试:)

用怪才,代码在蟒蛇:

import random
import sys

def OW60 ():
    """Do an open throw with a "60" sided dice"""
    val = 0
    sign = 1

    while 1:
        r1 = random.randint (1, 30)
        r2 = random.randint (1, 30)

        #print r1,r2
        val = val + sign * (r1 + r2)
        islow = 0
        ishigh = 0
        if r1 <= 5:
            islow += 1
        elif r1 >= 26:
            ishigh += 1
        if r2 <= 5:
            islow += 1
        elif r2 >= 26:
            ishigh += 1

        if islow == 2 or ishigh == 2:
            sign = 1
        elif islow == 1 and ishigh == 1:
            sign = -1
        else:
            break

        #print sign

    #print val
    return val

result = [0] * 2000
N = 100000
for i in range(N):
    r = OW60()
    x = r+1000
    if x < 0:
        print "Too low:",r
    if i % 1000 == 0:
        sys.stderr.write('%d\n' % i)
    result[x] += 1

i = 0
while result[i] == 0:
    i += 1

j = len(result) - 1
while result[j] == 0:
    j -= 1

pSum = 0
# Lower Probability: The probability to throw this or less
# Higher Probability: The probability to throw this or higher
print "Result;Absolut Count;Probability;Lower Probability;Rel. Lower Probability;Higher Probability;Rel. Higher Probability;"
while i <= j:
    pSum += result[i]
    print '%d;%d;%.10f;%d;%.10f;%d;%.10f' % (i-1000, result[i], (float(result[i])/N), pSum, (float(pSum)/N), N-pSum, (float(N-pSum)/N))
    i += 1
有帮助吗?

解决方案

我必须首先重写代码之前,我可以理解的:

def OW60(sign=1):
    r1 = random.randint (1, 30)
    r2 = random.randint (1, 30)
    val = sign * (r1 + r2)

    islow  = (r1<=5)  + (r2<=5)
    ishigh = (r1>=26) + (r2>=26)

    if islow == 2 or ishigh == 2:
        return val + OW60(1)
    elif islow == 1 and ishigh == 1:
        return val + OW60(-1)
    else:
        return val

也许你可能会找到这个小可读;我不知道。(做检查,如果它是相当于你怎么想的。) 此外,关于你的方式使用的"结果",在你的代码-你知道的蟒蛇的 字典s?

无论如何,问题的程式:假设F(x)是的 CDF 的OW60(1),即

F(x) = the probability that OW60(1) returns a value ≤ x.

同样地让

G(x) = the probability that OW60(-1) returns a value ≤ x.

然后你就可以计算F(x)从定义,总结了所有的(30×30)可能值的结果的第一掷.例如,如果第一次投掷是(2,3)然后你会再次推出,所以这一术语有助于(1/30)(1/30)(5+F(x-5)),以表达对于F(x)。所以你会得到一些猥亵长表达喜欢

F(x) = (1/900)(2+F(x-2) + 3+F(x-3) + ... + 59+F(x-59) + 60+F(x-60))

这是一笔超过900方面,每一个对(a、b)在[30个]×[30个].对(a、b)与≤5个或两个≥26有一个术语,a+b+F(x-a-b)中,对一个≤5和一个≥26有一个术语,a+b+G(x-a-b),其余的都一词,如(a+b),因为你不扔了。

同样,你有

G(x) = (1/900)(-2+F(x-2) + (-3)+F(x-3) + ... + (-59)+F(x-59) + (-60)+F(x-60))

当然,你可以收集系数;唯一的条款出现的是从F(x-60)F(x-52)和从F(x-10)至F(x-2)(a、b≥26或两≤5),并仅G的条款出现的是从G(x-35)至G(x-27)(一a、b≥26和其他≤5),所以有较少的条款于30条款。在任何情况下,限定的矢量V(x)

V(x) = [F(x-60) G(x-60) ... F(x-2) G(x-2) F(x-1) G(x-1) F(x) G(x)]

(说)你有(从那些表达形式针对F和G)一个关系的形式

V(x) = A*V(x-1) + B

对于一个适当的矩阵以及一个适当的载体B(其可以计算),因此开始从最初的价值形式V(x)=[0 0]的x足够小的,你可以找到F(x)和G(x)for x范围要任意关闭的精确度。(及f(x)的概率投掷x,只是F(x)-F(x-1),使得出来。)

可能有一个更好的办法。所有上述工作完成之后,虽然,为什么你要这样做?任何种类的分布你想,有很好的和简单的概率分布用适当的参数,即具有良好的性质(例如小的差异,片面的错误,无论).没有理由让自己的特别程序产生随机数字。

其他提示

我已经做了一些基本的统计数据样本的20万抛出。这里是结果:

Median: 17 (+18, -?) # This result is meaningless
Arithmetic Mean: 31.0 (±0.1)
Standard Deviation: 21 (+1, -2)
Root Mean Square: 35.4 (±0.7)
Mode: 36 (seemingly accurate)

错误是通过实验确定。算术平均值,模式是真的准确和不断变化的参数,甚至相当积极地似乎并不影响他们了。我想的行为中已经解释。

注:不采取这些数字对于一个适当的数学描述的功能。使用它们的快速获取的图片什么的分配。对于其他任何东西,他们没有足够精确的(尽管他们可能是准确的。

也许这是有帮助的人。

编辑2:

graph

根据刚991值。我可能已经挤着更多价值观纳入它,但是他们会扭曲结果。这样是相当典型的。

编辑1:

这里有上述的价值观只有一个向大会第六十面死的,为了比较:

Median: 30.5
Arithmetic Mean: 30.5
Standard Deviation: 7.68114574787
Root Mean Square: 35.0737318611

注意,这些价值计算,不是实验性的。

化合物无限的概率是...非微不足道的。我要处理的问题相同的方式作为詹姆斯*柯,但后来我看到你的源代码,可能有一个第三卷,以及第四,等等。问题是可以解决的,但远远超出了大多数死滚动模拟器。

是否有任何特别的原因,你需要一个随机的范围-Inf至+Inf与这样一个复杂的曲线周围1至60?为什么是钟形曲线的2D30不可接受的?如果你解释你的要求,就可能有人可以提供一个更简单和更有界的算法。

好吧,让我们来看看。的 第二 扔(其中有时将加上或减去第一卷)有一个很好的轻易可预测的钟形曲线周围31.第一卷,当然是问题。

对于第一卷,我们有900可能的组合。

  • 50组合的结果中添加第二卷。
  • 25组合的结果在减去第二卷。
  • 离开825组合,其相匹配的钟形曲线的第二卷。

减落(预先减)将形成一个钟形曲线范围(27..35).下一半的加法定会形成一个钟形曲线的范围(2..10),而上半部分将形成一个钟形曲线范围(52...60)

我probablity是有点生疏,因此我不能图的精确值,但应该清楚的是,这些会导致可预测值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top