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

ケース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が正しい答えを出している理由にもっと興味があります。

4

1 に答える 1

5

あなたのPythonコードは完全に間違っています。あなたがそれをしてほしいと思うのは次のとおりです。

  • 2つの配列aとbを取ります。各配列には、ランダム関数によって生成された10000個の数値が含まれています。(同等に、特定の分布に従ったデータからの10000サンプルの各配列。)
  • 値を10000ペアにペアリングし、各ペアはaから要素を取得し、bから要素を取得します。
  • 各ペアの合計を取ります。
  • それらの10000ペアの合計のうち0.9から1.8の間にあるものの数を数えます
  • 上記のカウントを10000で割って、これらの分布から抽出されたデータの任意のペアが合計で0.9〜1.8になる確率を取得し、その確率を出力します。

ただし、sim(a、b)関数は大きく異なることを実行しています。基本的に、実際に行っていることは次のとおりです。

  • 2つの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の初心者にとって理解しやすいはずです。)

これは、QBasicプログラムから理解したように、ケース1〜3のインタープリターで実行したテストの結果です。テスト4のQBasicコードを理解していなかったため、テスト4のバージョンを含めませんでした。最初の3つのテストの結果は、あなたが言ったとおりです。

>>> 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 に答える