लोड किए गए पासा के लिए डेटा संरचना?


130

मान लीजिए कि मैं एक n तरफा लोड मरने जहां हर तरफ कश्मीर कुछ संभावना पी है है कश्मीर आ रहा है जब मैं यह रोल की। मुझे उत्सुकता है अगर इस जानकारी को संवैधानिक रूप से संग्रहीत करने के लिए अच्छा एल्गोरिथ्म है (यानी संभावनाओं के एक निश्चित सेट के लिए) ताकि मैं कुशलतापूर्वक मरने के यादृच्छिक रोल का अनुकरण कर सकूं।

वर्तमान में, मेरे पास इस समस्या का O (lg n) समाधान है। विचार सभी k के लिए पहले k पक्षों की संचयी संभाव्यता की एक तालिका को संग्रहीत करने के लिए है, वे सीमा में एक यादृच्छिक वास्तविक संख्या उत्पन्न करते हैं [0, 1) और सबसे बड़ा सूचकांक प्राप्त करने के लिए तालिका पर एक द्विआधारी खोज करते हैं जिसका संचयी मूल्य चुने गए मूल्य से अधिक नहीं है। मुझे यह समाधान पसंद है, लेकिन यह अजीब लगता है कि रनटाइम संभावनाओं को ध्यान में नहीं रखता है। विशेष रूप से, एक तरफ के चरम मामलों में हमेशा ऊपर आने या मूल्यों को समान रूप से वितरित किया जाता है, एक भोले दृष्टिकोण का उपयोग करके ओ (1) में रोल का परिणाम उत्पन्न करना संभव है, हालांकि मेरा समाधान अभी भी लॉगरिदमिकल्लाह को कई कदम उठाएगा।

क्या किसी के पास इस समस्या को हल करने के तरीके के बारे में कोई सुझाव है जो किसी भी तरह से "रनटाइम" में है?

EDIT : इस प्रश्न के उत्तर के आधार पर, मैंने एक लेख लिखा है जिसमें इस समस्या के कई दृष्टिकोणों का वर्णन किया गया है , साथ ही उनके विश्लेषण भी। ऐसा लगता है कि वॉयस द्वारा अन्य विधि के कार्यान्वयन से Θ (एन) प्रीप्रोसेसिंग समय और ओ (1) समय प्रति मर रोल मिलता है, जो वास्तव में प्रभावशाली है। उम्मीद है कि यह उत्तर में निहित जानकारी के लिए एक उपयोगी अतिरिक्त है!


2
यह उचित है कि प्रत्येक विशिष्ट मामले के लिए O (1) समाधान मौजूद है ।
टिम

जवाबों:


117

आप उर्फ विधि की तलाश कर रहे हैं जो एक निश्चित असतत संभाव्यता वितरण (आप निरंतर समय में एन की लंबाई में प्रविष्टियों तक पहुंच सकते हैं) के लिए एक (ओ) (एन) सेट-अप के साथ एक ओ (1) विधि प्रदान करते हैं। । आप इसे में दस्तावेज प्राप्त कर सकते हैं अध्याय 3 (पीडीएफ) के "गैर वर्दी रैंडम variate पीढ़ी" ल्युक डेव्रोय द्वारा।

विचार संभावनाओं पी के अपने सरणी लेने के लिए है कश्मीर और तीन नए एन-तत्व सरणियों, क्ष उत्पादन कश्मीर , एक कश्मीर , और ख कश्मीर । प्रत्येक q k 0 और 1 के बीच एक प्रायिकता है, और प्रत्येक k और b k 1 और n के बीच का पूर्णांक है।

हम 1 और n के बीच यादृच्छिक संख्याएँ उत्पन्न करते हैं, दो यादृच्छिक संख्याएँ, r और s, 0 और 1. के बीच। I = मंजिल (r * N) +1। अगर q i <s तो i वापस लौटें b i । उपनाम विधि में कार्य यह पता लगाना है कि q k , k और b k कैसे उत्पन्न करें ।


इस तरह के एक उपयोगी एल्गोरिथ्म के लिए, अलियास विधि आश्चर्यजनक रूप से बहुत अच्छी तरह से ज्ञात नहीं है।
mhum

रिकॉर्ड के लिए: मैंने उर्फ ​​विधि apps.jcns.fz-juelich.de/ransampl का उपयोग करके यादृच्छिक नमूने के लिए थोड़ी सी लाइब्रेरी प्रकाशित की ।
जोआचिम डब्ल्यू

1
उपनाम पद्धति का एक विशिष्ट कार्यान्वयन धीमा हो सकता है, एक गलत तरीके से समय जटिलता के साथ एक विधि जैसे रूले व्हील को दिए गए nएल्गोरिदम को लागू करने में शामिल निरंतर कारकों के कारण उत्पन्न करने के लिए यादृच्छिक संख्याओं की एक चुनी हुई संख्या के लिए।
jfs

4

संतुलित बाइनरी खोज ट्री (या किसी सरणी में बाइनरी खोज) का उपयोग करें और O (लॉग एन) जटिलता प्राप्त करें। प्रत्येक मरने के परिणाम के लिए एक नोड है और कुंजी अंतराल है कि उस परिणाम को गति देगा।

function get_result(node, seed):
    if seed < node.interval.start:
        return get_result(node.left_child, seed)
    else if seed < node.interval.end:
        // start <= seed < end
        return node.result
    else:
        return get_result(node.right_child, seed)

इस समाधान के बारे में अच्छी बात यह है कि लागू करने के लिए बहुत सरल है, लेकिन अभी भी अच्छी जटिलता है।


ऊपर की तरह हाथ से बने द्विआधारी पेड़ को लागू करना आसान है, लेकिन यह संतुलित नहीं है
जुआन

यदि आप सही क्रम में इसका निर्माण करते हैं तो आप इसकी गारंटी दे सकते हैं।
ह्यूगोमग

3

मैं आपकी टेबल को दानेदार बनाने की सोच रहा हूं।

प्रत्येक मरने के मूल्य के लिए संचयी के साथ एक तालिका होने के बजाय, आप लंबाई xN का पूर्णांक सरणी बना सकते हैं, जहां संभावना की सटीकता बढ़ाने के लिए x आदर्श रूप से एक उच्च संख्या है।

अनुक्रमणिका मान के रूप में सूचकांक (xN द्वारा सामान्यीकृत) का उपयोग करके इस सरणी को पॉप्युलेट करें और सरणी में प्रत्येक 'स्लॉट' में, अगर यह सूचकांक आता है, तो वाइस-रोल को स्टोर करें।

शायद मैं एक उदाहरण के साथ आसान समझा सकता हूं:

तीन पासा का उपयोग करना: पी (1) = 0.2, पी (2) = 0.5, पी (3) = 0.3

एक सरणी बनाएं, इस मामले में मैं एक साधारण लंबाई चुनूंगा, 10. कहो (अर्थात, x = 3.33333)

arr[0] = 1,
arr[1] = 1,
arr[2] = 2,
arr[3] = 2,
arr[4] = 2,
arr[5] = 2,
arr[6] = 2,
arr[7] = 3,
arr[8] = 3,
arr[9] = 3

फिर संभावना प्राप्त करने के लिए, बस 0 और 10 के बीच एक संख्या को यादृच्छिक करें और बस उस सूचकांक तक पहुंचें।

इस पद्धति में सटीकता कम हो सकती है, लेकिन एक्स में वृद्धि और सटीकता पर्याप्त होगी।


1
पूर्ण सटीकता के लिए आप सरणी लुकअप को पहले चरण के रूप में कर सकते हैं, और कई अंतराल के अनुरूप सरणी अंतराल के लिए एक खोज करते हैं।
अज़

1

कस्टम वितरण के साथ यादृच्छिक पूर्णांक उत्पन्न करने के कई तरीके हैं (जिसे असतत वितरण के रूप में भी जाना जाता है )। पसंद कई बातों पर निर्भर करती है, जिसमें पूर्णांकों की संख्या से लेकर वितरण का आकार, और क्या वितरण समय के साथ बदल जाएगा।

सरल तरीके एक कस्टम वजन समारोह के साथ एक पूर्णांक का चयन करने में से एक f(x)है अस्वीकृति नमूने विधि। निम्नलिखित मानता है कि उच्चतम संभव मूल्य fहै max। अस्वीकृति नमूने के लिए समय की जटिलता औसत पर स्थिर है, लेकिन वितरण के आकार पर बहुत निर्भर करती है और हमेशा के लिए चलने का सबसे खराब मामला है। kअस्वीकृति नमूने का उपयोग करते हुए [1 ] में पूर्णांक चुनने के लिए :

  1. i[1 k] में एक समान यादृच्छिक पूर्णांक चुनें ।
  2. संभावना के साथ f(i)/max, वापसी i। अन्यथा, चरण 1 पर जाएं।

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

  • द ब्रेटमैन-लार्सन सक्सेस डेटा स्ट्रक्चर ("असतत वितरण से सक्सेन सैंपलिंग", 2012),
  • यूनपेंग तांग की बहु-स्तरीय खोज ("असतत वितरणों को बदलने के लिए यादृच्छिक नमूने के तरीकों का एक अनुभवजन्य अध्ययन", 2019), और
  • फास्ट लोडेड डाइस रोलर (2020)।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.