Sposób na niepowtarzalne losowanie z kolekcji

0

Hej,

Załóżmy, że mam sobie 2 x int[20] i chcę przy każdym obiegu pętli, losować jedną, niepowtarzalną wartość z jednej i drugiej kolekcji. Np. jak z kolekcji "A" wylosuję "15", a z kolekcji "B" wylosuję "10", to przy następnym obiegu pętli (lub dwóch pętli) te liczby nie mogą już zostać wylosowane. Pętla musi obiec po wszystkich elementach kolekcji, ale tak, by żaden się nie powtórzył. Jak to osiągnąć najbardziej optymalnym sposobem? Bardzo mi zależy na czystości rozwiązania. Będę bardzo wdzięczny za wskazówki!

PS temat jest osadzony w kontekście pobierania współrzędnych (x, y).

Pozdrawiam ciepło.

0

Tasujesz obie tablice i bierzesz po kolei :)

http://www.cplusplus.com/reference/algorithm/shuffle/

0

No nie wiem... bo jak mam np. "int[3] X" i "int[5] Y", to niestety nie mogę sobie pozwolić na wynik pętli (1, 1), (1, 2), (1, 3), (1, n), a później znowu (2, 1), (2, 2) itd... :< Muszę jakoś zrobić, by była losowość w wyborze i "int[] X" oraz "int[] Y".

PS ofkoz randomizacja niepowtarzalna.

1

Sprawdziłeś ten link? On tasuje tablicę - układa w losowej kolejności wszystkie elementy tablicy.

I jak masz int[3] i int[5] to ile par chcesz z tego wylosować?

1

Metoda java.util.Collections.shuffle losowo permutuje listę.

0

Uf, zrobione. Było trochę kombinacji, ale jesteśmy w domu :) W skrócie:

  1. Utworzyłem dwie tablice "int[]". Jedna z nich zawiera współrzędne x i y.
  2. Następnie metoda mieszająca obie tablice. Wsadzam do niej tablicę int[], przerabiam ją na List<Integer>, tasuję za pomocą Collections.shuffle(List<Integer>), przerabiam z powrotem List<Integer> na int[] i zwracam potasowaną tablicę.
  3. Przyszła kolej na tworzenie współrzędnych... no i tutaj się na chwilę zawiesiłem. Jednak po chwili przypomniało mi się, że gdzieś słyszałem o Map i HashMap, więc google poszło w ruch i utworzyłem metodę pobierającą tablicę x oraz y. Pytanie jednak jak te dwie tablice ze sobą połączyć? Odpowiedź nasunęła się sama - prosta klasa Point przyjmująca dwa pola i dwa parametry w konstruktorze x i y :) Tak więc w zagnieżdżonej pętli for (długość tablicy x i długość tablicy y) potworzyłem obiekty klasy Point i pododawałem je do HashMapy. Jako klucz dla obiektów mapy po prostu dodawałem inkrementującą wartość int :) Mam już swoje współrzędne. Do "pełnej" randomizacji należy jednak jeszcze utworzyć również tablicę dla kluczy mapy i ją także przetasować.
  4. Ostatnim krokiem było wyświetlanie punktów. Tutaj już po prostu poszło wyciąganie kolejnych elementów z mapy po kolei :) I gotowe :) Dzięki za odpowiedzi ;)

Pozdrawiam.

0

Jeszcze mała uwaga: gdybyś używał tablicy dużych Integerów, to mógłbyś zamienić tablicę Integerów na Listę za pomocą metody java.util.Arrays.asList, a Listę na tablicę Integerów za pomocą metody toArray. Z tym, ze duże Integery zajmują duużo więcej pamięci niż małe.

Ewentualnie Google Guava ma klasę com.google.common.primitives.Ints z metodami asList przyjmującą int[] i zwracającą List<Integer> i metodę toArray robiącą operację odwrotną.

0

To nie jest maksymalna losowość. Przykład - 2 tablice:
[1, 2, 3]
[1, 2, 3, 4, 5].

Tasowanie:
[3, 1, 2]
[3, 2, 1, 5, 4]

Łączenie punktów:
[3, 3], [3, 2], [3, 1], [3, 5], [3, 4], [1, 3] ... [1, 4], [2, 3] .. [2, 4].

Najpierw wygeneruj wszystkie możliwe pary, a później potasuj. W innym wypadku wyniki będą przewidywalne.

0

Nie załapałeś ;) Wygenerowałem wszystkie pary, które przytoczyłeś w "łączenie punktów" za pomocą podwójnej zagnieżdżonej pętli for. Następnie dodałem tak utworzone pary do HashMapy(key, para). Dalej utworzyłem tablicę(key) mającą długość ilości par w HashMapie. Ów tablicę przetasowałem. I ostatecznie wyciągam elementy z HashMapy posługując się zmienną iteracyjną np. "int i = 0", która przy każdym wyciągnięciu "klucza" po indeksie z tablica(key) inkrementuje ++. Tak więc pobieram losowe klucze z ów tablicy i z ich pomocą następnie pobieram elementy z mojej HasMapy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1