2015-09-10 5 views
6

Potrzebuję zainicjować tablicę znaków z 1000 losowymi znakami między [a,..z] i [A,..,Z].Generator losowych macierzy Java

Nie chcę tego, najpierw generując tylko znaki między [a,..z], a następnie tylko znaki w [A...Z], ale traktuj wszystkie 52 znaki jednakowo.

Wiem, że jednym ze sposobów jest wygenerowanie liczby losowej między 0 a 51 i przypisanie jej jednej z wartości znaku.

Jak podchodzę do tego problemu lub przypisuję wartości do liczb losowych od 0 do 51?

+0

Mam tablicę o wielkości 1000, która zawiera duże i małe litery całego alfabetu. Jak wydrukować całkowitą liczbę małych liter wygenerowanych i całkowitą liczbę wygenerowanych wielkich liter? RÓWNIEŻ Liczba zliczonych ilości każdej litery (liczba i liczba wygenerowanych listów) oraz procent wszystkich znaków reprezentowanych przez tę literę. – linyu21

Odpowiedz

1

Pozwolę sobie podać kilka ogólnych wskazówek. Wspomniany "sposób na zrobienie tego" działa. Polecam używanie HashMap<E>. Możesz przeczytać więcej o hashmaps w docs:

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

Alternatywnie, można użyć inną tablicę, która zawiera A - Z i A - Z i można użyć numeru indeksu, aby odnieść się do nich. Ale w tym przypadku wydaje mi się, że bardziej sensowne jest używanie numeru HashMap<E>.

Myślę, że wiesz, jak utworzyć obiekt Random. Ale jeśli nie, sprawdź docs:

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

Więc w zasadzie użyć metody nextInt klasy Random do generowania liczb losowych. I możesz umieścić tę losową liczbę w swojej macierzy HashMap lub tablicy. Następnie dodajesz tę postać do tablicy, która przechowuje wynik programu.

+0

Czy hashset nie jest dobrym pomysłem, jeśli chcesz uzyskać dostęp do wielu losowych wartości? – HopefullyHelpful

+0

Ale myślę, że dla początkującego powinieneś mniej przejmować się osiągami. W tym przypadku najlepiej jest przechowywać rzeczy, których pary wartości klucza I: – Sweeper

+1

Cóż, nigdy nie pracowałem z HashSets, ale wydaje się, że nie mają one metody pobierania/pobierania, która akceptowałaby losową wartość. Jak więc użyć hashsetu do tworzenia losowych wyników en mass? Wiem, że możesz użyć HashMap, podobnie jak assoziative array. Ale hashset? – HopefullyHelpful

5

Masz ciekawy pomysł na kod. Tutaj może być myśl.

  1. Weź wszystkie a-z i A-Z i przechowuj je w tablicy [].
  2. Losowo generuj liczbę od 1 do 52 (należy użyć klas API).
  3. Otrzymasz numer w kroku 2, weź go jako indeks tablicy i wybierz ten indeks z array[] znaków.
  4. Umieść zaznaczony znak w wybranym miejscu/formacie ............
  5. Przetwarzaj.

Pozdrawiam.

+0

Wypełniłem tablicę o rozmiarze 51 i wypełniłem ją liczbami ASCII dla dużych i małych liter, a następnie użyłem generatora losowego w mojej pierwszej tablicy, aby wypełnić moją główną tablicę o rozmiarze 1000, jak to brzmi – linyu21

+0

pierwsza faza to uzyskaj losowy znak w zakresie 1-52 (az, AZ), gdy otrzymasz znak, a następnie wypełnij go do indeksu tablicy o wielkości 1000 w pętli. – shaun

0

Jest to praca próbka nadzieję, że to będzie pracować dla Ciebie

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

Nie o to prosił OP. On/ona nie chce generować a-z i A-Z oddzielnie – Sweeper

0

Najprostszym rozwiązaniem byłoby:

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

Jeśli nie podoba dostępu generator liczb losowych dwa razy, ty może generować liczby od 0 do 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); 
} 

Jednak nie widzę żadnych zalet tego podejścia. Wewnętrznie r.nextInt może również zmieniać swój stan wewnętrzny kilka razy.Dystrybucja powinna być podobna w obu przypadkach.

0

Można to zrobić za pomocą funkcji wykorzystującej tablice lub arithemtic. Należy pamiętać, że można obliczyć takie znaki, jak w przypadku liczb, ponieważ są one zapisywane jako liczby (http://www.asciitable.com/), należy również pamiętać, że cyfry, małe litery i duże litery są zapisywane kolejno, aby dostęp do zakresów był prosty i prosty. pętla.

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

Wersja wykorzystująca tablicę będzie szybsza, ale może być używana tylko wtedy, gdy zbiór możliwych wyników jest wystarczająco mały, aby mógł być przechowywany.

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