2015-09-10 3 views
6

Ho bisogno di inizializzare un array di caratteri con 1000 caratteri casuali tra [a,..z] e [A,..,Z].Generatore di array casuale Java

Non voglio farlo generando prima solo i caratteri tra [a,..z] e quindi solo i caratteri in [A...Z] ma trattano tutti i 52 caratteri in modo uguale.

So che un modo per farlo è generare un numero casuale compreso tra 0 e 51 e assegnargli uno dei valori dei caratteri.

Come posso affrontare questo problema o assegnare valori ai numeri casuali tra 0 e 51?

+0

Ho una matrice di dimensione 1000 che contiene lettere maiuscole e minuscole dell'intero alfabeto. Come si stampa il numero totale di lettere minuscole generato e il numero totale di lettere maiuscole generato? ANSI Un conteggio di quante lettere sono state generate (mostrando la lettera e quanti sono stati generati) e la percentuale del totale che tale lettera rappresenta. – linyu21

risposta

1

Consentitemi di darvi alcune linee guida generali. Il "one way to do this" di cui hai parlato funziona. Raccomando di usare un HashMap<E>. Si può leggere di più su HashMaps nella documentazione:

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

In alternativa, è possibile utilizzare un altro array che contiene un - Z e A - Z ed è possibile utilizzare il numero di indice per riferirsi a loro. Ma in questo caso penso che abbia più senso usare uno HashMap<E>.

Penso che tu sappia come creare un oggetto Random. Ma se non, controllare i documenti:

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

Così che, fondamentalmente, utilizzare il metodo nextInt della classe Random per generare un numero casuale. E puoi inserire quel numero casuale nel tuo HashMap o array. E poi hai appena messo quel personaggio in una matrice che memorizza il risultato del programma.

+0

L'hashset non è una cattiva idea se vuoi accedere a molti valori casuali? – HopefullyHelpful

+0

Ma immagino che per un principiante dovresti preoccuparti meno delle prestazioni. In questo caso, ha più senso archiviare le cose coppie di valori chiave – Sweeper

+1

Bene, non ho mai lavorato con HashSet, ma non sembrano aver recuperato/ottenuto il metodo che accetta un valore casuale. Quindi, come si potrebbe usare un hashset per creare risultati casuali in massa? So che potresti usare una HashMap, proprio come un array assoziative. Ma hashset? – HopefullyHelpful

5

Hai un'idea interessante del codice. Qui potrebbe esserci il pensiero.

  1. Prendere tutti gli a-z e A-Z e memorizzarli in un array [].
  2. Generare in modo casuale un numero compreso tra 1 e 52 (utilizzare le classi API per quello).
  3. Otterrai un numero nel passaggio 2, prendilo come indice di matrice e scegli questo indice da array[] di caratteri.
  4. Posizionare il carattere selezionato nella posizione/formato desiderato ............
  5. Elaborarlo.

I migliori saluti.

+0

ho riempito una matrice di dimensione 51 e l'ho popolata con i numeri ascii per le lettere maiuscole e minuscole, poi ho usato il generatore casuale sul mio primo array per riempire la mia matrice principale di 1000 come suona quella – linyu21

+0

la prima fase è ottenere un carattere casuale compreso nell'intervallo 1-52 (az, AZ), quando si ottiene un carattere e quindi lo si riempie fino all'indice di 1000 dimensioni all'interno di un ciclo. – shaun

0

Questo è il lavoro del campione, spero che questo funzionerà per voi

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

Questo non è ciò che l'OP chiedeva. Lui/lei non vuole generare a - z e A - Z separatamente – Sweeper

0

L'approccio più semplice potrebbe essere:

// 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')); 
} 

Se non vi piace l'accesso a generatore di numeri casuali due volte, può generare numeri da 0 a 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); 
} 

Tuttavia, non vedo alcun vantaggio di questo approccio. Internamente r.nextInt potrebbe anche cambiare il suo stato interno più volte.La distribuzione dovrebbe essere simile in entrambi i casi.

0

È possibile ciò con una funzione che utilizza matrici o aritmetiche. Nota che puoi calcolare con caratteri come con i numeri, perché sono memorizzati come numeri (http://www.asciitable.com/), noterai anche che le cifre, le lettere minuscole e le lettere grandi sono memorizzate in sequenza in modo che l'accesso agli intervalli sia piuttosto semplice con una semplice for- ciclo continuo.

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); 
    } 
} 

La versione utilizzando una matrice sarà più veloce, ma può essere utilizzato solo se l'insieme dei possibili risultati è abbastanza piccolo per essere memorizzati.

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]; 
}