Python代码翻译问题或随机数生成的语言差异



我是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

案例2:

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错误。但是情况正在发生。它似乎与代码的任何差异无关。关于翻译,他们俩似乎都在说同样的话。

我对他们给出2种不同结果的原因感兴趣。我对Python为什么给出错误的答案和QBASIC更感兴趣。

您的python代码完全错误。我认为您要做的是以下内容:

  • 取两个数组A和B,每个数组包含由某些随机函数生成的10000个数字。(等效地,每个给定分布之后的数据中每个数据的阵列10000个样本。)
  • 将这些值分解为10000对,每对从a中获取一个元素,并从b。
  • 中取一个元素
  • 拿每对的总和。
  • 计算其中有多少个10000对 - 在0.9和1.8
  • 之间
  • 将上述计数除以10000,以获取从这些分布中绘制的任何给定数据的概率总和到0.9至1.8之间,并打印该概率。

但是,您的SIM(a,b)功能正在做一些的事情。基本上,您实际在做的是:

  • 连接两个10000个元素阵列,形成其元素的20000元素阵列。
  • 以大于0.9的新20000元素阵列中的任何元素的总和。
  • 将该总和除以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 Newbie来说,应该很容易理解。)

这是我从QBASIC程序中理解的,我在解释器中为您的案例1到3进行了测试的结果。我还没有包含测试4的版本,因为我不了解测试4的QBASIC代码4。前三个测试的结果是您说的。

>>> 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

相关内容

  • 没有找到相关文章

最新更新