पिछले समाधान इष्टतम नहीं हैं। जटिलता RandNum50 के लिए कॉल में बिल्कुल है और इसे यादृच्छिक रूप से बिट के स्रोत के रूप में उपयोग करते हुए यहां कुछ विवरण में वर्णित किया गया है (जैसा कि Vor द्वारा सुझाया गया है):nlogn+O(1)
if ( rand50() > 25 ) then b = 1 else b = 0 // random bit
मूल विचार यह है कि यदि आप और बीच एक समान उत्पन्न करते हैं, तो आप बहुत सारे बिट्स बचाते हैं, और फिर फैक्टोरियल बेस अपघटन का उपयोग करते हुए , वर्दी का एक क्रम उत्पन्न करने के बजाय , फिर , फिर , आदि, । यह वास्तव में है, जैसा कि मैंने पोस्ट में उल्लेख किया है, एक पेपर का विषय जो मैंने प्रस्तुत किया है!एन ! 1 2 3 एन1n!123n
यदि आप यह नहीं जानते हैं कि वर्दी कैसे उत्पन्न की जाती है, जैसा कि उस पोस्ट में बताया गया है, तो एक यादृच्छिक बिट से, आप सीधे वर्दी का एक अनुमान भी उत्पन्न कर सकते हैं, इस तरह से (जो वोर के "सही मायने में" के बराबर है, लेकिन तेजी से):
P = (RandNum50()-1) + (RandNum50()-1)*50^1 + (RandNum50()-1)*50^2 + ...
जहां तक जाने की जरूरत है, वहां जाना। यह बेस में विकसित कर रहा है । तो बस आपके मामले में , यानी, काट देना चाहिए। यह मान पूरी तरह से यादृच्छिक नहीं है, लेकिन यह एकरूपता का एक उपाय है जो अक्सर उपयोग किया जाता है। या, जैसा कि Vor बताता है, आप को अस्वीकार कर सकते हैं । फिर इस मान के साथ, आप पोस्ट में वर्णित तथ्यात्मक आधार विस्तार कर सकते हैं ।50 पीP50Pn = 100 !Q=Pmodnn=100!P>n