2015-09-10 7 views
6

मुझे 1000[a,..z] और [A,..,Z] के बीच यादृच्छिक वर्णों वाले अक्षरों की एक सरणी प्रारंभ करने की आवश्यकता है।रैंडम ऐरे जेनरेटर जावा

मैं इसे पहले से ही [a,..z] के बीच वर्ण उत्पन्न करने और [A...Z] में केवल वर्ण उत्पन्न करने के लिए ऐसा नहीं करना चाहता हूं लेकिन सभी 52 वर्णों का समान रूप से व्यवहार करता हूं।

मुझे पता है कि ऐसा करने का एक तरीका 0 और 51 के बीच एक यादृच्छिक संख्या उत्पन्न करना है और इसे वर्ण मानों में से एक असाइन करना है।

मैं इस समस्या से कैसे संपर्क करूं या 0 और 51 के बीच यादृच्छिक संख्याओं को मान निर्दिष्ट करूं?

+0

मेरे पास आकार 1000 की एक सरणी है जिसमें पूरे वर्णमाला के ऊपरी केस अक्षरों और निचले केस अक्षर होते हैं। मैं उत्पन्न किए गए निचले केस अक्षरों की कुल संख्या कैसे मुद्रित करूं और ऊपरी केस अक्षरों की कुल संख्या उत्पन्न हुई? ALSO प्रत्येक पत्र में से कितने उत्पन्न हुए थे (पत्र दिखा रहा था और कितने उत्पन्न हुए थे) साथ ही उस पत्र का प्रतिनिधित्व करने वाले कुल प्रतिशत का प्रतिशत। – linyu21

उत्तर

1

मुझे आपको कुछ सामान्य दिशानिर्देश देने दें। "यह करने का एक तरीका" आपने कार्यों का उल्लेख किया। मैं HashMap<E> का उपयोग करने की सलाह देता हूं। आप डॉक्स में HashMaps के बारे में अधिक पढ़ सकते हैं:

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

वैकल्पिक रूप से, आप एक और सरणी है कि एक में शामिल है का उपयोग कर सकते हैं - z और A - Z और आप उन्हें का उल्लेख करने के इंडेक्स नंबर का उपयोग कर सकते हैं। लेकिन इस मामले में मुझे लगता है कि HashMap<E> का उपयोग करने के लिए यह अधिक समझ में आता है।

मुझे लगता है कि आप जानते हैं कि Random ऑब्जेक्ट कैसे बनाएं। लेकिन अगर आप नहीं, बाहर किए गए दस्तावेज़ों की जाँच करते हैं:

http://docs.oracle.com/javase/7/docs/api/java/util/Random.html

तो तुम मूल रूप से Random वर्ग के nextInt विधि का उपयोग एक यादृच्छिक संख्या उत्पन्न करने के लिए। और आप उस यादृच्छिक संख्या को अपने HashMap या सरणी में डाल सकते हैं। और फिर आप उस चरित्र को एक सरणी में डाल दें जो प्रोग्राम के परिणाम को संग्रहीत करता है।

+0

यदि आप बहुत यादृच्छिक मानों तक पहुंचना चाहते हैं तो हैशसेट एक बुरा विचार नहीं है? – HopefullyHelpful

+0

लेकिन मुझे लगता है कि शुरुआत के लिए आपको प्रदर्शन के बारे में कम ध्यान रखना चाहिए। इस मामले में, यह सामान को महत्वपूर्ण मूल्य जोड़ों को स्टोर करने का सबसे अधिक अर्थ बनाता है – Sweeper

+1

ठीक है, मैंने कभी हैशसेट्स के साथ काम नहीं किया है, लेकिन ऐसा लगता है कि वे एक यादृच्छिक मूल्य स्वीकार करने वाली विधि को पुनर्प्राप्त/प्राप्त नहीं कर पाएंगे। तो कोई व्यक्ति बड़े पैमाने पर यादृच्छिक परिणामों को बनाने के लिए हैशसेट का उपयोग कैसे करेगा? मुझे पता है कि आप एक अश्वशक्ति सरणी की तरह, हैश मैप का उपयोग कर सकते हैं। लेकिन हैशसेट? – HopefullyHelpful

5

आपको दिलचस्प कोड विचार मिला है। यहां विचार हो सकता है।

  1. सभी ए-जेड और ए-जेड लें और उन्हें एक सरणी में स्टोर करें []।
  2. बेतरतीब ढंग से (उस के लिए उपयोग एपीआई वर्ग) 1-52 के बीच एक संख्या उत्पन्न करते हैं।
  3. आप चरण 2 में एक नंबर पाने के एक सरणी सूचकांक के रूप में यह लेने के लिए और वर्ण के array[] से इस सूचकांक का चुनाव करेगा।
  4. प्लेस कि अपने इच्छित स्थान/प्रारूप करने के लिए चार उठाया ............
  5. यह प्रक्रिया।

बेस्ट सादर।

+0

मैंने आकार 51 की एक सरणी भर दी और इसे पूंजी और निचले केस अक्षरों के लिए एसीआईआई संख्याओं के साथ पॉप्युलेट किया, फिर मैंने अपने पहले सरणी पर यादृच्छिक जेनरेटर का उपयोग आकार 1000 की मुख्य सरणी भरने के लिए किया, यह ध्वनि – linyu21

+0

कैसे पहला चरण है जब आप एक char प्राप्त करते हैं तो रेंज 1-52 (एजे, एजेड) के भीतर एक यादृच्छिक चार प्राप्त करें, फिर इसे अपने 1000 आकार के सरणी अनुक्रमणिका में लूप के भीतर भरें। – shaun

0

यह नमूना काम है, उम्मीद है कि इस आप

import java.util.ArrayList; 
import java.util.Random; 

public class RandomNumber { 

    public static void main(String args[]) { 
     char c; 
     ArrayList<Character> character = new ArrayList<Character>(); 
     Random rn = new Random(); 
     for (int i = 0; i < 500; ++i) { 

      character.add((char) (rn.nextInt(26) + 66)); 
      character.add((char) (rn.nextInt(26) + 97)); 
     } 

     System.out.println(character); 
    } 
} 
+0

यह ओपी के लिए नहीं पूछा गया है। वह एक जेड और ए - जेड को अलग से उत्पन्न नहीं करना चाहता है – Sweeper

0

सरल दृष्टिकोण होगा के लिए काम करेंगे:

// constant declared in the class 
static final int LETTERS_COUNT = 'z'-'a'+1; 

char[] randomChars = new char[500]; 
Random r = new Random(); 
for(int i=0; i<randomChars.length; i++) { 
    randomChars[i] = (char)(r.nextInt(LETTERS_COUNT) + (r.nextBoolean() ? 'a' : 'A')); 
} 

आप तक पहुँचने यादृच्छिक संख्या जनरेटर दो बार पसंद नहीं है, तो आप 0 से 51:

for(int i=0; i<randomChars.length; i++) { 
    int num = r.nextInt(LETTERS_COUNT*2); 
    randomChars[i] = (char)(num >= LETTERS_COUNT ? 'a'+(num-LETTERS_COUNT) : 'A'+num); 
} 

हालांकि मुझे इस दृष्टिकोण के कोई लाभ नहीं दिख रहे हैं। आंतरिक रूप से r.nextInt कई बार अपनी आंतरिक स्थिति भी बदल सकता है।वितरण दोनों मामलों में समान होना चाहिए।

0

आप इसे एरे या अरिथेमेटिक का उपयोग करके फ़ंक्शन के साथ कर सकते हैं। ध्यान दें कि आप संख्याओं के साथ वर्णों की गणना कर सकते हैं, क्योंकि उन्हें संख्याओं (http://www.asciitable.com/) के रूप में संग्रहीत किया जाता है, आप यह भी ध्यान देंगे कि अंकों, छोटे अक्षरों और बड़े अक्षरों को अनुक्रम में संग्रहीत किया जाता है ताकि श्रेणियों तक पहुंच एक साधारण के लिए बहुत आसान हो। पाश।

private Random r = new Random(); 
public char randomLetter() { 
    int randomNumber = this.r.nextInt(52); 
    if(randomNumber >= 26) { 
     return (char)(('A'+randomNumber)-26); 
    } else { 
     return (char)('a'+randomNumber); 
    } 
} 

एक सरणी का उपयोग करने वाला संस्करण तेज़ होगा, लेकिन केवल तभी उपयोग किया जा सकता है जब संभावित परिणामों का सेट संग्रहित करने के लिए पर्याप्त छोटा हो।

private Random r = new Random(); 
private static char[] set = new char[52]; //static because we only need 1 overall 
static { //this is a static "constructor" 
    for(int i = 0; i < 26; i++) { 
     set[i] = (char)('a'+i); 
     set[i+26] = (char)('A'+i); 
    } 
} 

public char fastRandomLetter() { 
    final int randomNumber = this.r.nextInt(52); 
    return set[randomNumber]; 
} 
संबंधित मुद्दे