0

我是 Python 新手,没有使用 QBasic 的经验。我在 Python 中运行了一个模拟,得出了理论上错误的值。然后我在 QBasic 中运行它并得出了理论上的预测值。

以下是测试用例。我只计算概率 P(0.9<%Y<=1.8) 所以计数必须在这些值范围内。1-random.random() 仅适用于这种情况,当我尝试将其用于所有情况时,他们仍然得出错误的值。这是理论上的结果,你可以看到它有什么不同:

y~u(0,1) = 0.575

y~exp(2) = 0.3371

x1~u(0,1) x2~u(0,2) = 0.4475

P(y=0.25)=0.8 P(y=1.5)=0.2 = 0.32


在 Python 中,模拟代码为:

def test():
  x1,x2,c = 0.0,0.0,0.0
  for i in range(10000):
    if random.random()< 0.8:
      x1 += 0.25
    else:
      x2 += 1.5
    y = x1 + x2
    if y>0.9 and y<=1.8:
      c = c + 1
  return x1,x2,c

print "test: ",test()

def sim(a,b):
  #pyab1 = sum([a for a in a if a>0.9 and a<=1.8])/10000
  #pyab2 = sum([b for b in b if b>0.9 and b<=1.8])/10000
  #print "*****",float(pyab1+pyab2)
  #print a+b
  #array1 = [[a],[b]]
  array1 = a+b
  #array1.extend(a)
  #array1.extend(b)
  #c = 0
  #for y in array1:
    #if y>0.9 and y<=1.8:
      #c = c + 1
  pyab = sum([y for y in array1 if y>0.9 and y<=1.8])/10000
  print("P(a < x <= b) : {0:8.4f}".format(pyab))

这是 Python 输出,后面是它应该给出的值,但这显示了结果有多远。

case 1: P(a < x <= b) : 0.7169 #should be 0.575 
case 2: P(a < x <= b) : 0.4282 #should be 0.3371 
case 3: P(a < x <= b) : 0.5966 #should be 0.4475 
case 4: P(a < x <= b) : 0.5595 #should be 0.32 

在 QBasic 中,模拟代码是:

情况1:

RANDOMIZE
FOR i = 1 TO 10000
    X1 = RND(1)
    X2 = RND(1)
    Y = X1+X2
    IF (Y>0.9) AND (Y<=1.8) THEN C=C+1
NEXT i

PRINT C/10000

案例二:

RANDOMIZE
FOR i = 1 TO 10000
    X1 = (-0.5)*(LOG(1-RND(1)))
    X2 = (-0.5)*(LOG(1-RND(1)))
    Y = X1+X2
    IF (Y>0.9) AND (Y<=1.8) THEN C=C+1
NEXT i

PRINT C/10000

案例3:

RANDOMIZE
FOR i = 1 TO 10000
    X1 = RND(1)
    X2 = RND(1)*2
    Y = X1+X2
    IF (Y>0.9) AND (Y<=1.8) THEN C=C+1
NEXT i

PRINT C/10000

案例4:

RANDOMIZE
FOR i = 1 TO 10000
    X14 = RND(1)
    X24 = RND(1)
    IF (X14<0.8) THEN X41=0.25 ELSE X41=1.5
    IF (X24<0.8) THEN X42=0.25 ELSE X42=1.5
    Y = X1+X2
    IF (Y>0.9) AND (Y<=1.8) THEN C=C+1
NEXT i

PRINT C/10000

这是 QBasic 输出,它显示了这实际上是如何获得正确的结果的。

case 1: P(a < x <= b) :  0.5715 
case 2: P(a < x <= b) :  0.3371 
case 3: P(a < x <= b) :  0.4413 
case 4: P(a < x <= b) :  0.3213 

以上所有代码都对我有用,没有错误。我看不到用于获取值的算法有任何差异。不确定 Python 生成的数字是否与 QBasic 不同,以及这是否解释了这种行为背后的原因。

我对这两种语言都很陌生,但 QBasic 似乎非常原始,而且 Python 似乎更有可能得到正确的答案而 QBasic 得到错误的答案。但相反的情况正在发生。它似乎与代码中的任何差异无关。在翻译时,他们似乎都在说同样的话。

我对他们给出两种不同结果的原因很感兴趣。我更感兴趣的是为什么 Python 给出了错误的答案而 QBasic 给出了正确的答案。

4

1 回答 1

5

您的 Python 代码完全错误。我认为你想要它做的是以下几点:

  • 取两个数组 a 和 b,每个数组包含由某个随机函数生成的 10000 个数字。(等效地,每个数组都包含 10000 个样本,这些样本来自遵循某个给定分布的数据。)
  • 将这些值配对为 10000 对,每对从 a 中获取一个元素,从 b 中获取一个元素。
  • 取每一对的总和。
  • 计算这 10000 个对和中有多少在 0.9 和 1.8 之间
  • 将上述计数除以 10000 以获得从这些分布中提取的任何给定数据对的总和在 0.9 和 1.8 之间的概率,并打印该概率。

但是,您的 sim(a, b) 函数正在做一些完全不同的事情。基本上,你实际上在做的是:

  • 连接两个 10000 元素数组,形成它们元素的 20000 元素数组。
  • 取这个新的 20000 元素数组中大于 0.9 的任何元素的总和。
  • 将该总和除以 10000 并打印出来。

此算法与您的 Q-Basic 代码中的任何内容都没有相似之处。

如果我正确理解了您的问题,我认为您希望您的 sim 功能是这样的:

def sim(x_sample, y_sample):

    count = 0
    for i in range(10000):
        if 0.9 <= x_sample[i] + y_sample[i] <= 1.8:
            count += 1

    probability = count/10000.0

    print("P(a < x <= b) : {0:8.4f}".format(probability))

(几乎可以肯定有更优雅和 Pythonic 的方式来实现上述功能,但这种方式对于 Python 新手来说应该很容易理解。)

这是我在解释器中为您的案例 1 到 3 运行的测试结果,因为我已经从 QBasic 程序中理解了它们。我没有包含测试 4 的版本,因为我不理解测试 4 的 QBasic 代码。不过,前三个测试的结果是你说的应该是这样。

>>> from random import random
>>> 
>>> sim([random() for i in range(10000)],
...     [random() for i in range(10000)])
P(a < x <= b) :   0.5746
>>>      
... from math import log
>>> 
>>> sim([-0.5*log(1-random()) for i in range(10000)],
...     [-0.5*log(1-random()) for i in range(10000)])
P(a < x <= b) :   0.3405
>>>     
... sim([random() for i in range(10000)],
...     [2*random() for i in range(10000)])
P(a < x <= b) :   0.4479
于 2012-11-11T18:21:40.303 回答