मेरे पास जावा में यादृच्छिक कतार का कार्यान्वयन है I हालांकि एंक्यू, डेक्यू और नमूना संचालन ठीक काम करते हैं, आईटरेटर में फेरबदल पद्धति में हर समय फेंकने के लिए अमान्य रेंज अपवाद का कारण बनता है।
मुझे समझ में नहीं आ रहा है कि क्यों shuffle में यादृच्छिक संख्या पीढ़ी )
विधि कतार के आकार के द्वारा बाध्य है यहां कोड है:
निजी इंट एन = 0; निजी आइटम [] कतार; सार्वजनिक यादृच्छिक प्रश्न () {क़तार = (आइटम []) नई वस्तु [8]; } // एक खाली यादृच्छिक कतार सार्वजनिक बूलियन का निर्माण होता है खाली () {return N == 0; } // कतार खाली है? सार्वजनिक पूर्ण आकार () {वापसी एन; } // कतार में निजी शून्य का आकार बदलने वाले आइटम की संख्या वापस लौटाएं (इंट क्षमता) {आइटम [] कॉपी = (आइटम []) नई वस्तु [क्षमता]; के लिए (इंट आई = 0; आई & lt; एन; आई ++) {कॉपी [आई] = कतार [आई]; } कतार = प्रतिलिपि; } प्राइवेट क्लास क्वयइइटरेटर इयोनेटर & lt; आइटम & gt; {int i = 0; सार्वजनिक कतारइटरेटर () {if (N & gt; 0) {shuffle (); }} @ ओवरराइड पब्लिक बूलियन में है अगला () {वापसी i & lt; N; } @ ओवरराइड सार्वजनिक आइटम अगला () {आइटम आइटम = कतार [i]; i ++; वस्तु वापस; } @ ओवरराइड सार्वजनिक शून्य निकालें () {नए java.lang को फेंक दें। असमर्थितऑपरेशन अपवाद ("निकालना समर्थित नहीं है"); }} सार्वजनिक शून्य एन्क्यू (आइटम आइटम) {यदि (आइटम == नल) {नया java.lang.NullPointerException ("रिक्त आइटम सम्मिलित नहीं कर सकता"); } अगर (एन == क्यूई लम्बाई) {पुनः आकार (2 * क्यूई लम्बाई); } कतार [N ++] = आइटम; } // आइटम को सार्वजनिक आइटम डेक्यू () जोड़ना (यदि (रिक्त () है) {नया जावा। ऊतक। किसी भी प्रकार के अपवाद ("कतार खाली है"); } Int i = StdRandom.uniform (0, N); आइटम आइटम = कतार [i]; विनिमय (मैं, एन 1); एन = एन 1; क़तार [एन] = बातिल; वस्तु वापस; } // निकालें और एक यादृच्छिक आइटम सार्वजनिक आइटम का नमूना वापस करें () {यदि (एलीटी ()) {नया java.util.NoSuchElementException ("कतार रिक्त है"); } Int i = StdRandom.uniform (0, N); वापसी कतार [i]; } // वापसी (लेकिन हटाएं) एक यादृच्छिक वस्तु सार्वजनिक इटरेटर & lt; आइटम & gt; इटरेटर () {नया क्वूइटरेटर () लौटा); } // यादृच्छिक क्रम में वस्तुओं पर एक स्वतंत्र पुनरावृत्त वापसी निजी शून्य विनिमय (int i, int j) {आइटम स्वैप = क़तार [i]; कतार [i] = कतार [जे]; कतार [जे] = स्वैप; } निजी शून्य फेरबदल () {for (int i = 0; i & lt; N; i ++) {int j = StdRandom.uniform (0, i); विनिमय (i, j); }}
विधि में फेरबदल ()
: < / P>
निजी शून्य फेरबदल () (के लिए (इंट i = 0; i & lt; N; i ++) {int j = StdRandom.uniform (0, i); विनिमय (i, j); }}
पहले पुनरावृत्ति में, जब आप StdRandom.uniform (0, 0)
को कॉल करते हैं, तो यह अपवाद फेंकता है क्योंकि दूसरा तर्क कड़ाई से बड़ा होना चाहिए सबसे पहला। शायद आपको लूप के लिए अपना
बदलना चाहिए ताकि
i
के लिए न्यूनतम मान 1 हो।
से:
वर्दी
सार्वजनिक स्थिर इंट वर्दी (int a, int b)
[a, b] में समान रूप से पूर्णांक देता है।
< P> ब्लॉकक्वाइट>
No comments:
Post a Comment