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

sta*_*ser 0 python simulation qbasic

我是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))
Run Code Online (Sandbox Code Playgroud)

这是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 
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

案例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
Run Code Online (Sandbox Code Playgroud)

案例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
Run Code Online (Sandbox Code Playgroud)

案例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
Run Code Online (Sandbox Code Playgroud)

这是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 
Run Code Online (Sandbox Code Playgroud)

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

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

我对它们给出2种不同结果的原因感兴趣.我更感兴趣的是为什么Python给出了错误的答案,QBasic给出了正确的答案.

Mar*_*ery 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))
Run Code Online (Sandbox Code Playgroud)

(几乎可以肯定有更优雅和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
Run Code Online (Sandbox Code Playgroud)