2014-07-16 8 views
5

समस्या का प्रयास: संभावना है कि दो पासा में से एक तीसरे मरने से अधिक मूल्यवान होगा।पायथन यादृच्छिक नहीं है

समस्या: किसी कारण के लिए, जब मैं अजगर से random मॉड्यूल (विशेष रूप से नमूना विधि) का उपयोग, मैं जब जब मैं numpy का उपयोग से एक अलग (और गलत) परिणाम के साथ समाप्त। मैंने नीचे परिणामों को शामिल किया है। कोड के दोहराए गए निष्पादन के समान परिणाम उत्पन्न होते हैं। कोई विचार, random.sample विधि और numpy.random.random_integers के अलग-अलग परिणाम क्यों हैं, भले ही उनके पास एक ही कार्य हो?

import numpy as np                
import random                 


random_list = []                 
numpy_list = []                 
n= 500                   
np_wins = 0                  
rand_wins = 0                 
for i in range(n):                
    rolls = random.sample(range(1,7), 3)           
    rand_wins += any(rolls[0] < roll for roll in rolls)       

    rolls = np.random.random_integers(1, 6, 3)         
    np_wins += any(rolls[0] < roll for roll in rolls)       


print "numpy : {}".format(np_wins/(n * 1.0))          
print "random : {}".format(rand_wins/(n * 1.0))   

परिणाम:

 

Press ENTER or type command to continue 
numpy : 0.586 
random : 0.688 
 

उत्तर

4

मनाए गए अंतर का कारण यह है कि प्रतिस्थापन के बिना random.sample नमूने (here देखें), जबकि numpy.random.random_integers प्रतिस्थापन के साथ नमूने।

2

दो यहाँ समस्याओं (एक नाबालिग, एक महत्वपूर्ण):

  1. आपका नमूने का आकार बहुत एक अच्छा परिणाम प्राप्त करने के छोटा है। अगर मैं केवल 500 रोल करता हूं, तो मुझे 0.55 और 0.62 के बीच परिणाम मिलता है। शायद ही सटीक।

  2. random.sample दिए गए अनुक्रम से उन्हें वापस रखे बिना 3 आइटम चुनता है। तो आप तीन पासा रोल नहीं कर रहे हैं, आप सीमा [1, 6] से तीन अलग-अलग संख्याएं चुन रहे हैं।

    वास्तव में, यदि मैं ऐसा करता हूं, तो संभावना 67% है, जबकि समस्या के लिए आपने कहा है कि यह लगभग 58% है, जैसा आपने देखा था।

PowerShell परीक्षण कोड मैं प्रयोग किया है:

मूल समस्या बयान:

(1..500 | %{ 
    $r = 0..2 | %{ Get-Random -min 1 -max 7 } 
    !!($r|?{$r[0] -lt $_}) 
} | measure -ave).Average 

आपका त्रुटिपूर्ण विधि:

(1..500 | %{ 
    $r = 1..6 | Get-Random 3 
    !!($r|?{$r[0] -lt $_}) 
} | measure -ave).Average 

उन उपज ही परिणाम अंतर आप मनाया।

+0

अपेक्षाकृत छोटे नमूना अनुभाग की पहचान के लिए समस्याओं का अच्छा स्पष्टीकरण, और +1। यह ध्यान देने योग्य है कि numpy.random.random_integers() सही परिणाम उत्पन्न करेगा, समस्या # 2 को संबोधित करेगा, जबकि नमूना बढ़ाना n = 100000 समस्या # 1 को कम करेगा। –

3

random.sample() डबल मानों को रोकता है। यह उन्हें बदलने के बिना ड्राइंग नंबरों की तरह है, इसलिए परिणाम [ 1, 1, 1 ] कभी नहीं होगा।

np.random.random_integers() दूसरी तरफ आप वास्तव में क्या चाहते हैं यदि आप तीन मरने वाले रोल अनुकरण करते हैं।

आप उसी परिणाम प्राप्त करने के लिए [ random.randint(1, 6) for _ in range(3) ] जैसे sth द्वारा अपने random.sample() को प्रतिस्थापित कर सकते हैं।

संबंधित मुद्दे