2011-02-04 38 views
5

मेरी परियोजना के एक हिस्से के रूप में मुझे संख्याओं का एक सेट देकर दो या दो अंकों की यादृच्छिक संख्या बनाने की आवश्यकता है। मैं इसके लिए एक सूची या सरणी लागू नहीं करना चाहता, क्योंकि मुझे प्रत्येक फ़ंक्शन कॉल के लिए 1 यादृच्छिक संख्या प्राप्त करनी चाहिए।गैर दोहराव यादृच्छिक संख्या

मैंने जावा के सिक्योररैंडम क्लास का उपयोग करने की कोशिश की। मुझे कुछ साइटों से भी मदद मिली, लेकिन मैं बीच में फंस गया हूं, क्या हम मूल्यों को घुमा सकते हैं और इसे पूरा कर सकते हैं? लेकिन मुझे नहीं पता कि यह कैसे किया जा सकता है। क्या कोई मेरी मदद कर सकता है?

import java.security.SecureRandom; 
public class RandomNumber { 
private static final RandomNumber rnd= new RandomNumber(); 

    private static final char[] VALUES = new char[] { 
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    private static final SecureRandom srn= new SecureRandom(); 
    public String createID() 
    { 
     byte[] bytes = new byte[3]; 
     srn.nextBytes(bytes); 

    } 
+1

क्या यह संख्या उस संख्या के भीतर है जो गैर-दोहराव या परिणामस्वरूप 2 या 3 अंक संख्या होनी चाहिए? आपका शफल प्रश्न पूर्व को सुझाता है लेकिन बाद वाला होमवर्क असाइनमेंट की तरह लगता है। –

+0

गैर-दोहराने के बाद कोई भी संख्या दो या समान रूप से गैर-दोहराने वाली नहीं है? – biziclop

+0

नहीं..पॉल .... संख्या के भीतर अंकों को दोहराया जा सकता है ... लेकिन प्रत्येक कॉल के लिए जेनरेट की गई संख्या अद्वितीय होनी चाहिए .... (उदाहरण: 331 संभव है ... लेकिन 331 को दूसरी बार उत्पन्न नहीं किया जाना चाहिए समय ...) – vidhya

उत्तर

12

Fisher-yates shuffle algorithm जाने का रास्ता है। शफल करने के लिए यह कुशल है। और यह रैखिक समय में काम करता है।

यहाँ

जब मनोज के कोड दोहराता इसे और अधिक मान [] के बजाय उच्च लोगों के निचले तत्वों स्वैप करने के लिए की संभावना है algo

To shuffle an array a of n elements: 
    for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

और कोड

for(int i=VALUES.length-1; i>0; i--){ 
      int rand = (int) (Math.random()*i); 
      char temp = VALUES[i]; 
      VALUES[i] = VALUES[rand]; 
      VALUES[rand] = temp; 
    } 
+0

धन्यवाद मनोज ... लेकिन उपरोक्त कार्यक्रम का आउटपुट एक सरणी होगा .. सही ..? तो मैं हर बार प्रत्येक फंक्शन कॉल के लिए एकल मूल्य कैसे प्राप्त कर सकता हूं ..? – vidhya

+0

@ विध्य: बस सभी ~ 1000 संभावित मानों को एक सरणी और शफल में डाल दें। तो आपको बस इतना करना है कि आप कितने नंबरों का उत्पादन कर चुके हैं, ट्रैक करने के लिए एक चर रखें, और शफल किए गए सरणी में अगले को पुनर्प्राप्त करना जारी रखें। –

-2

है। पूर्व: i = 9 के लिए सरणी के किसी भी सदस्य (स्वयं सहित) के साथ स्वैप करने का 1/10 मौका है। फिर i = 8 के लिए हम कभी भी VALUES [9] के साथ स्वैप नहीं कर सकते क्योंकि Math.random() * मैं केवल 0 से 8 तक फैल सकता हूं। इसका मतलब है कि VALUES [9] मूल VALUES [9] के बराबर होगा अन्य तत्व इसके संबंधित तत्व के बराबर होगा (और इसलिए जब मैं छोटा हो जाता हूं तो स्वैप होने की संभावना बढ़ रही है)।

मैं बस ऊपर जवाब को सही करने के लिए सरणी के तत्वों के वजन नहीं करना चाहते हैं: (के रूप में आप की तरह या रूप में कई बार)

for(int i=0; i <= VALUES.length - 1; i++){ 
     int rand = (int) (Math.random()*(VALUES.length-1)); 
     char temp = VALUES[i]; 
     VALUES[i] = VALUES[rand]; 
     VALUES[rand] = temp; 

अब फेरबदल किया जाता है VALUES.length बार और नहीं करता है सरणी के किसी विशेष तत्व का पक्ष लें।

+2

असल में, आपका "बगफिक्स" एक बग पेश करता है। यह एक आम गलतफहमी है कि यह विकिपीडिया पर भी [चर्चा] (http://en.wikipedia.org/wiki/Fisher-Yates#Implementation_errors) है। – meriton

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