2012-03-23 3 views
5

आपको आकार एन की एक सरणी दी गई है, जिसमें मनमानी बूलियन मान शामिल हैं।बूलियन की एक सरणी को देखते हुए, यादृच्छिक TRUE मान की अनुक्रमणिका का चयन करने का सबसे प्रभावी तरीका क्या है?

यादृच्छिक TRUE मान की अनुक्रमणिका को वापस करने का सबसे तेज़ तरीका क्या है।

एल्गोरिदम को यादृच्छिक रूप से किसी भी सूचकांक को TRUE युक्त वापस करना चाहिए।

उत्तर

5

कुछ इस तरह:

1: (1/1) * (1/2) * (2/3) * (3/4) = 1/4 
2: (1/2) * (2/3) * (3/4) = 1/4 
3: (1/3) * (3/4) = 1/4 
4: 1/4 = 1/4 

संपादित करें: स्टीव जेसप ने बताया चल बिन्दु तुलना

int count = 0; 
int index = -1; 
for (int i = 0; i != n; ++i) 
{ 
    if (values[i]) 
    { 
     ++count; 
     if (unit_random <= 1.0f/count) 
     { 
      index = i; 
     } 
    } 
} 
उदाहरण के लिए 4 मूल्यों के लिए

तो तुम अपने इंडेक्स के लिए निम्नलिखित संभावनाओं मिल अंत में एक बहुत ही समान वर्दी चयन का नेतृत्व करेंगे। rand के असतत प्रकृति के कारण

typedef unsigned long long u64; 
u64 product = u64(count) * rand(); 
if (product <= u64(RAND_MAX)) 

यह एकदम सही वितरण नहीं दे देंगे, लेकिन यह बेहतर होगा: मान लिया जाये कि unit_randomrand()/RAND_MAX तुलना के रूप में परिभाषित किया गया है करने के लिए बदला जा सकता है।

+0

क्षमा है, मैं एक शब्द भी भूल गया। मेरा कहना था: एक यादृच्छिक TRUE मान की अनुक्रमणिका लौटें ... केवल हमें नहीं मिला पहला। लेकिन फ़ंक्शन को किसी भी इंडेक्स को यादृच्छिक रूप से वापस करना चाहिए। – PaulV

+0

@PaulV यह वही है जो यह कार्य करता है। –

+0

@ निक हाँ, लेकिन मैंने अपना जवाब संपादित कर दिया है;) –

0

यह स्पष्ट नहीं है कि "यादृच्छिक रूप से विचलित" का अर्थ क्या है। क्या इसका मतलब है "कुछ अज्ञात वितरण के साथ"? यदि हां, तो सभी संभावित वितरणों का नाटक करना उतना ही संभव है, इसलिए "अपेक्षित वितरण" (जैसे "अपेक्षित मूल्य") समान है (सभी संभावित वितरणों का "औसत")। फिर कोई भी सूचकांक 1/2। तो आपका काम सरणी के माध्यम से जितनी जल्दी हो सके पुनरावृत्ति का कार्य बन जाता है। शुरुआत में शुरू करें, जैसे कि आप सामान्य रूप से एक सरणी को फिर से चालू करेंगे, जब तक कि आपको कोई वास्तविक मूल्य न हो।

+0

मेरा मतलब है कि मूल्यों के लिए कोई पैटर्न नहीं है। वे किसी भी तरह के वितरण समारोह का पालन नहीं करते हैं। – PaulV

+1

अनुमान है कि इसका मतलब है [समान वितरण] (http://en.wikipedia.org/wiki/Uniform_distribution_ (अलग)), है ना? ;) –

+0

@PaulV: "यादृच्छिक रूप से वितरित" शायद इसका उपयोग करने के लिए एक खराब वाक्यांश है यदि आपका मतलब है कि "वे किसी भी प्रकार के वितरण फ़ंक्शन का पालन नहीं करते हैं"। आप "मनमानी बुलियन मूल्य", या सिर्फ "बुलियन मूल्य" कह सकते थे। फिर आपको "सबसे तेज़" से क्या मतलब है, इसे परिभाषित करना होगा, क्योंकि यदि आपके पास मानों के लिए वितरण नहीं है तो किसी भी एल्गोरिदम के लिए "अपेक्षित रनटाइम" जैसी कोई चीज़ नहीं है जिसका गति मूल्यों पर निर्भर करता है। –

0

इसे वापस करने के लिए, आपको सबसे पहले सही मानों की गणना करनी होगी (इसे छोड़ने का कोई तरीका नहीं है) और अपने सूचकांक को अन्य सरणी में जमा करें। और गिनने के बाद आपको 0 से एन -1 तक यादृच्छिक पूर्णांक उत्पन्न करना होगा (जहां एन सही मानों की संख्या है) और बनाए गए सरणी से मान चुनें।

छद्म अजगर में

:

indices=[] 

for i,val in enumerate(arr): 
    if val: 
     indices.append(i) 
randi = randint(0,len(indices)-1) 
return indices[randi] 
1

तेज समाधान - यह सोचते हैं कि आप एक ही सरणी पर बार-बार का चयन नहीं करते - एक यादृच्छिक सूचकांक लेने, इसे वापस अगर यह सच है, और यदि नहीं दोहराने के लिए है। सबसे अच्छे मामले में, जहां सभी प्रविष्टियां सत्य हैं, यह ओ (1) है; सबसे बुरे मामले में, जहां केवल एक प्रविष्टि सत्य है, यह ओ (एन) है (प्रत्येक प्रयास में एकमात्र सच्चे मूल्य को मारने का 1/एन मौका होता है, जिसका मतलब एन की कोशिश की अपेक्षित संख्या है)। यह किसी भी अन्य पोस्ट समाधान से भी बदतर नहीं है।

यदि आप सरणी को आमतौर पर लगभग सभी झूठी होने की उम्मीद करते हैं, हालांकि, आप एक और समाधान चुनना चाहेंगे, क्योंकि इस यादृच्छिक विधि के रनटाइम में भिन्नता उच्च होगी।

+1

"यह किसी अन्य पोस्ट किए गए समाधानों से भी बदतर नहीं है" - जटिलता नहीं है, लेकिन यह एंड्रियास के उत्तर से कम कुशलता से कैश का उपयोग करती है। और एफडब्ल्यूआईडब्ल्यू, एंड्रियास का कोड विफलता के मामले को पकड़ता है, और यह दृष्टिकोण नहीं है। हो सकता है कि "सर्वश्रेष्ठ" चीज (अपेक्षित बनाम सबसे बुरी स्थिति से व्यापार करना) यादृच्छिक नमूने की एक छोटी संख्या को निष्पादित करना है, और यदि उनमें से कोई भी सही मूल्य नहीं पाता है तो निष्कर्ष निकाला जाता है कि सरणी स्पैस है, और एंड्रियास के समाधान या इसी तरह वापस आती है । –

0

सरल समाधान: (? 1: एन) संभव अनुक्रमित का क्रमपरिवर्तन उत्पन्न और है कि क्रमचय वापसी सूचकांक के क्रम में अगर संबंधित मान सच

def randomTrue(x): 
    perm = randomPermute(0:len(x)) 
    for i in perm: 
     if x[i]: 
      return i 
संबंधित मुद्दे

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