2016-12-12 5 views
58

का पालन नहीं करता है, मैं एक परियोजना को अनुकरण करने के लिए पायथन में यादृच्छिक लाइब्रेरी के साथ खेल रहा था और मैंने खुद को एक बहुत ही अजीब स्थिति में पाया।रैंडिंट हमेशा समान वितरण

मान लें कि हम अजगर में निम्न कोड करते हैं:

from random import randint 
import seaborn as sns 

a = [] 
for i in range(1000000): 
    a.append(randint(1,150)) 

sns.distplot(a) 

साजिश एकदम सही ढंग से एक "असतत वर्दी" वितरण इस प्रकार है।

Range betwee 1 and 150

हालांकि, जब मैं 1 से 110 के लिए सीमा बदलने के लिए, भूखंड कई चोटियों है।

from random import randint 
import seaborn as sns 

a = [] 
for i in range(1000000): 
    a.append(randint(1,110)) 

sns.distplot(a) 

Range from 1 to 110

मेरे छाप, कि चोटियों 0,10,20,30 पर हो रहा है ... लेकिन मैं यह व्याख्या करने में सक्षम नहीं हूँ।

संपादित करें: प्रश्न प्रस्तावित एक के साथ डुप्लिकेट के समान नहीं था क्योंकि मेरे मामले में समस्या समुद्री तट पुस्तकालय थी और जिस तरह से मैंने डेटा को देखा था।

संपादित करें 2: जवाब पर सुझाव के बाद, मैं Seaborn पुस्तकालय बदलकर इसे सत्यापित करने की कोशिश की। इसके बजाय, matplotlib दोनों रेखांकन का उपयोग कर एक ही

from random import randint 
import matplotlib.pyplot as plt 

a = [] 
for i in range(1000000): 
    a.append(randint(1,110)) 

plt.hist(a) 

From matplotlib

+0

संभावित डुप्लिकेट [क्या पायथन यादृच्छिक है। सांख्यिकीय रूप से यादृच्छिक है?] (Http: // stackoverflow।com/प्रश्न/12164280/है-अजगर-यादृच्छिक randint-सांख्यिकीय यादृच्छिक) – ChatterOne

+5

आप अपने आरोपित कर्नेल घनत्व साजिश से देखने के लिए कि चोटियों असली नहीं हैं सक्षम होना चाहिए। –

+1

और अब आप इस पहेली को हल कर सकते हैं: अब https://ericlippert.com/2012/02/24/a-simple-puzzle/ –

उत्तर

116

समस्या randint() में नहीं, अपने फोटोग्राफर, seaborn में हो रहा है थे।

मेरी गिनती के अनुसार, आपके seaborn वितरण आरेख में 50 डिब्बे हैं। ऐसा लगता है कि समुद्री डाकू वास्तव में उन डिब्बे में आपके randint() मूल्यों को वापस कर रहा है, और 110 मूल्यों का विस्तार भी 50 डिब्बे में फैलाने का कोई तरीका नहीं है। इसलिए आप उन चोटियों को प्राप्त करते हैं जहां अन्य मूल्यों को अन्य डिब्बे के लिए सामान्य दो मानों की बजाय बिन में डाल दिया जाता है। आपके चोटियों के मूल्य इसकी पुष्टि करते हैं: वे अन्य बारों की तुलना में 50% अधिक हैं, जैसा कि 2 के बजाय 3 पिन किए गए मानों के लिए अपेक्षित है।

यह जांचने के लिए एक और तरीका है seaborn इनके लिए 55 डिब्बे का उपयोग करना 110 मूल्य (या शायद 10 डिब्बे या 110 के कुछ अन्य विभाजक)। यदि आपको अभी भी चोटियां मिलती हैं, तो आपको randint() पर चिंता करनी चाहिए।

+12

जब कुछ इतना स्पष्ट है लेकिन आप सिर्फ अंधे हैं! अब 100% समझ में आता है। आपके उत्तर के लिए धन्यवाद। जैसे ही समय सीमा गुजरती है इसे स्वीकार करेंगे :) – Tasos

+4

हम सभी के पास स्पष्ट दिखने के उन क्षण हैं: मैं निश्चित रूप से करता हूं! और आपका स्वागत है। –

20

@RoryDaulton के उत्कृष्ट जवाब देने के लिए जोड़ने के लिए, मैं randint(1:110) भाग गया, एक आवृत्ति गिनती पैदा करने और इस तरह गिनतियों का आर-वेक्टर करने के लिए इसे परिवर्तित:

hits = {i:0 for i in range(1,111)} 
for i in range(1000000): hits[randint(1,110)] += 1 
hits = [hits[i] for i in range(1,111)] 
s = 'c('+','.join(str(x) for x in hits)+')' 
print(s) 

c(9123,9067,9124,8898,9193,9077,9155,9042,9112,9015,8949,9139,9064,9152,8848,9167,9077,9122,9025,9159,9109,9015,9265,9026,9115,9169,9110,9364,9042,9238,9079,9032,9134,9186,9085,9196,9217,9195,9027,9003,9190,9159,9006,9069,9222,9205,8952,9106,9041,9019,8999,9085,9054,9119,9114,9085,9123,8951,9023,9292,8900,9064,9046,9054,9034,9088,9002,8780,9098,9157,9130,9084,9097,8990,9194,9019,9046,9087,9100,9017,9203,9182,9165,9113,9041,9138,9162,9024,9133,9159,9197,9168,9105,9146,8991,9045,9155,8986,9091,9000,9077,9117,9134,9143,9067,9168,9047,9166,9017,8944) 

मैं तो एक अनुसंधान करने के लिए इस चिपकाया -console, टिप्पणियों का पुनर्निर्माण और अनुसंधान के hist() इस्तेमाल किया परिणाम पर, इस हिस्टोग्राम (सुपरइम्पोज़्ड घनत्व वक्र के साथ) प्राप्त:

enter image description here

आप देख सकते हैं, इस बात की पुष्टि करता समस्या यह है कि आपने देखा है randint पर पता लगाने योग्य नहीं है लेकिन sns.displot() का आर्टिफैक्ट है।

+1

मुझे लगता है कि हिस्टोग्राम में 22 बार गिनती, और निश्चित रूप से 22 की पुष्टि और मेरा उत्तर की ओर से व्याख्या के लिए की 110 धन्यवाद एक भाजक है। –

+0

@RoryDaulton अच्छा अवलोकन के बारे में 22. मैं हिस्टोग्राम बदलाव ताकि अब यह एक आरोपित घनत्व के साथ एक संभावना हिस्टोग्राम है, इसलिए और अधिक बारीकी से क्या ओ पी कर रहा था मिलान। –

+0

आप 'साथ hist (एक्स, टूट जाता है = seq (0110, द्वारा = 2.2))' Seaborn साजिश करने के लिए एक समान प्रभाव प्राप्त कर सकते हैं। उत्सुकता से, 50 डिब्बे मांगना सीधे प्रभाव नहीं देता है। – James

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