2011-04-11 16 views
5

के साथ एन संख्याओं का चयन करना कुछ कोड में मैं n[0,1) में यादृच्छिक संख्या चुनना चाहता हूं जो 1 पर है।निश्चित राशि

मैं [0,1) में स्वतंत्र रूप से संख्या को चुनने और कुल योग से हर एक को विभाजित करके उन्हें सामान्य करके ऐसा कर:

numbers = [random() for i in range(n)] 
numbers = [n/sum(numbers) for n in numbers] 

मेरे "समस्या" है कि वितरण मैं बाहर निकलना काफी तिरछा है,। एक लाख नंबरों का चयन करना एक भी नहीं है 1/2 से अधिक हो जाता है। कुछ प्रयासों से मैंने पीडीएफ की गणना की है, और यह अच्छा नहीं है।

यहाँ है अजीब लग रही पीडीएफ मैं 5 चर के लिए मिलती है:

enter image description here

आप एक अच्छा एल्गोरिथ्म संख्या का चयन करने के लिए एक विचार है, एक और अधिक वर्दी या साधारण वितरण में है कि परिणाम?

+5

मुझे यकीन नहीं है कि मैं समझता हूं, यदि आप नंबर 1 को दस लाख यादृच्छिक टुकड़ों में तोड़ते हैं तो _shouldn't_ 0.5 से अधिक नहीं हो सकता है। यदि वहां था, तो इसका मतलब यह होगा कि 99 99, 999 को दूसरे छमाही में फिट होना होगा। – DShook

+0

संभावित डुप्लिकेट [पाइथन में मान के बराबर कई यादृच्छिक संख्याएं उत्पन्न करें] (http://stackoverflow.com/questions/3589214/generate-multiple-random-numbers-to-equal-a-value-in-python) –

उत्तर

15

आप के लिए 1.

चुनें एन 0 से दूरी विभाजन करने के लिए देख रहे हैं।

यह अंतरिक्ष 0 से 1 का विभाजन करेगा, जो कभी-कभी बड़े परिणाम को प्राप्त नहीं करना चाहिए जो आपको नहीं मिल रहा है।

फिर भी, एन के बड़े मूल्यों के लिए, आप आमतौर पर अपने अधिकतम मूल्य को कम करने की अपेक्षा कर सकते हैं, बस आपकी विधि जितनी जल्दी हो सके।

+1

एक सुंदर एल्गोरिदम। क्या आप जानते हैं कि इसके परिणामस्वरूप क्या वितरण हो सकता है? –

+0

इसे "यादृच्छिक विभाजन" कहने के अलावा, मुझे इसका संदर्भ देने का कोई तरीका नहीं पता है। मैंने इसे हमेशा सेगमेंट की लंबाई के वितरण से नहीं, चीजों के विभाजन पक्ष से देखा है। – LanceH

+0

मैंने सीडीएफ '1- (1-x)^एन' और pmf' n (1-x)^(n-1) 'को घटा दिया है। डिस्ट्रीब्यूशन सीमों की तुलना में छोटी संख्याओं की उच्च संभावना है (इसमें 1/एन के करीब चोटी नहीं है), इसलिए शायद इसकी अधिक संख्याएं भी होंगी। मैंने अभी तक Dirichlet वितरण के साथ इसकी तुलना नहीं की है। –

4

Random Vectors with Fixed Sum पर एक नज़र डालें। डाउनलोड लिंक MATLAB कोड और एल्गोरिदम समझाते हुए एक दस्तावेज़ के साथ एक फ़ाइल की ओर जाता है।

+0

यह एक सामान्य मामला है जहां प्रत्येक 'xi' प्रतिबंधित है <= xi <= b'। –

4

आपको Dirichlet distribution में रुचि हो सकती है जिसका उपयोग मात्रा उत्पन्न करने के लिए किया जाता है जो कि यदि आप संभावनाओं की तलाश में हैं तो 1 तक की राशि। गामा वितरण here का उपयोग करके उन्हें उत्पन्न करने के तरीके पर एक अनुभाग भी है। , 1 संख्या 0 से 1 के लिए उन्हें सॉर्ट और उनमें से प्रत्येक के बीच दूरी तय -

+0

आपको आम तौर पर कुछ वितरण की आवश्यकता होती है जो आपकी संख्याओं को आकर्षित करने के लिए वर्दी से अलग है। चूंकि नौकरी के उत्तर से पता चलता है, आप "पीकियर" परिणाम प्राप्त करने के लिए अल्मा <1 के साथ गामा वितरण का उपयोग कर सकते हैं। ऐसा करने से आपको Dirichlet वितरण से एक ड्रॉ मिल जाएगा जो सुविधाजनक है क्योंकि यह आपके द्वारा मांगी जाने वाली बहुतायत से पहले संयोग है। –

+0

आलेख में एक अच्छा "ड्राइंग" अनुभाग है, जिसमें मैंने कुछ कोड उदाहरण जोड़े हैं। मुझे सच में यकीन नहीं है कि क्या यह मायने रखता है कि पैरामीटर क्या हैं, जब तक वे बराबर हैं? –

0

एक और तरीका है n यादृच्छिक संख्या जो राशि प्राप्त करने के लिए 1 के लिए:

import random 


def create_norm_arr(n, remaining=1.0): 
    random_numbers = [] 
    for _ in range(n - 1): 
     r = random.random() # get a random number in [0, 1) 
     r = r * remaining 
     remaining -= r 
     random_numbers.append(r) 
    random_numbers.append(remaining) 
    return random_numbers 

random_numbers = create_norm_arr(5) 
print(random_numbers) 
print(sum(random_numbers)) 

यह अधिक संख्या अधिक होने की संभावना बनाता है।

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