Jak dobrać losowo kolejność około 20 elementów o najniższej złożoności? (generowanie losowych permutacji)Algorytm generowania losowej kolejności elementów
Odpowiedz
jest dobrym wyborem.
Rozczarowujące, że ktoś powiedział coś innego, szczerze mówiąc. –
Cóż, jestem rozczarowany, że to jest odpowiedź. Ponieważ musisz najpierw przetestować listę, aby ją wypełnić, a następnie przetasować ją (z poprawnie dobranym algorytmem), pomyślałbym, że istnieje lepsze rozwiązanie. – SourceOverflow
Kilka miesięcy temu napisałem na blogu o uzyskaniu losowej permutacji listy liczb całkowitych. Możesz użyć tego jako permutacji indeksów zestawu zawierającego twoje elementy, a wtedy masz to, czego chcesz.
W pierwszym poście zbadać kilka możliwości i w końcu uzyskać "funkcja losowo permutate ogólny listę O (n) złożoność" , odpowiednio enkapsulowany do pracy na niezmiennych danych (tzn. jest wolny od efektów ubocznych).
W drugim poście udostępniam go jednolicie.
Kod jest w języku F #, mam nadzieję, że nie masz nic przeciwko!
Powodzenia.
EDIT: nie mam formalnego dowodu, ale intuicja mówi mi, że złożoność takiego algorytmu nie może być niższa niż O (n). Naprawdę byłbym wdzięczny za to, że zrobiłem to szybciej!
rekursja w drugim artykule jest prosta .. myślę, że mógłbym użyj go .. – Ante
Wszystkie permutacje muszą być możliwe, a ponowne ustawienie tablicy w derangement (czyli permutacja 'p' dla której' p (k)! = k' dla wszystkich 'k') wymaga, aby każdy element być odwiedzanym. Stąd O (n) najgorszy przypadek. Czy to wciąż nie jest wystarczająco formalne? –
Również O (n) przeciętny przypadek z tego samego dowodu, pomyśl o tym, ponieważ IIRC proporcja permutacji (1 ... n), które są derangencjami zbliża się do 1/e, gdy n zbliża się do nieskończoności. –
Prosty sposób losowania zamówienia polega na utworzeniu nowej listy prawidłowego rozmiaru (20 w twoim przypadku), iteracji na pierwszej liście i dodania każdego elementu w losowej pozycji do drugiej listy. Jeśli losowa pozycja jest już wypełniona, umieść ją w następnej wolnej pozycji.
myślę, że to pseudokod jest poprawna:
list newList
foreach (element in firstList)
int position = Random.Int(0, firstList.Length - 1)
while (newList[position] != null)
position = (position + 1) % firstList.Length
newList[position] = element
EDIT: Okazuje się, że ta odpowiedź nie jest faktycznie tak dobry. Nie jest ani szczególnie szybki, ani szczególnie losowy. Dziękuję za twoje komentarze. Aby uzyskać dobrą odpowiedź, przewiń z powrotem na górę strony :-)
W najgorszym przypadku ten algorytm to O (n^2) (tzn. Jeśli generator liczb losowych mówi "1, 1, 1, 1, 1, 1, 1, ...", pozwalam ci obliczyć resztę) niezbyt zoptymalizowany. –
Umieszczenie przedmiotów w następnej wolnej pozycji powoduje, że jest mniej losowy. Przedmioty zachowają swoje pierwotne zamówienie bardziej niż w prawdziwie losowym tasowaniu. Aby to naprawić, musisz wybrać nową losową pozycję, gdy pozycja jest zajęta, co oczywiście sprawia, że jest znacznie wolniej. – Guffa
To dobry punkt Guffa. Nigdy tego nie zauważyłem. Dzięki. Przynajmniej coś się tutaj nauczyłem :-) –
Prawdopodobnie ktoś już zaimplementował tasowanie. Na przykład w Pythonie można użyć random.shuffle
, w C++ random_shuffle
oraz w PHP shuffle
.
hmm .. php może? – Ante
Co zaskakujące, w PHP nazywa się 'shuffle' :). Zaktualizuję odpowiedź. –
- 1. java - Algorytm generowania losowej ścieżki w 2d tablicy char
- 2. Wiąz generowania losowej liczby
- 3. szyn: każdy w kolejności losowej
- 4. Algorytm generowania dekompozycji drzewa
- 5. Algorytm generowania maski bitowej
- 6. Algorytm generowania obrazów symetrycznych
- 7. Nie można wznowić działalność w kolejności losowej
- 8. Wywołanie metod w kolejności losowej (C#)
- 9. Optymalny algorytm do generowania liczby losowej R nie w zbiorze liczb N
- 10. C# algorytm do generowania hierarchii
- 11. Zmiana kolejności elementów
- 12. odwrotnej kolejności zestaw elementów
- 13. Internet Explorer wyświetla atrybuty XML w losowej kolejności
- 14. IntStream z losowej i losowej współbieżności
- 15. Algorytm losowej przestrzeni graniczącej z elementami o tej samej długości.
- 16. Jak używać Pythona `secret` module do generowania losowej liczby całkowitej?
- 17. Prosty algorytm do generowania macierzy dodatnio-półwymiarowych
- 18. Pomysły na algorytm generowania losowego kwiatu
- 19. Algorytm do generowania kształtu fali z audio
- 20. Algorytm generowania losowego łańcucha z surowymi ograniczeniami - Java
- 21. Czy mogę przeprowadzić test NUnit w losowej kolejności?
- 22. Ustawianie zdefiniowanej losowej kolejności dla tablicy w PHP
- 23. Jak mogę uruchomić testy JUnit w losowej kolejności?
- 24. Jak iterować przez Dict w kolejności losowej w Pythonie?
- 25. Ruby - Wykonywanie testów w losowej kolejności z prowizją
- 26. Algorytm optymalizacji kolejności działań z czasami odnowienia
- 27. Wyświetlanie kolejności wierszy w kolejności losowej w przewijaniu listy w Androidzie
- 28. SQL Server Wyświetlanie elementów w określonej kolejności
- 29. Zmiana kolejności elementów w pliku plist
- 30. JavaFx 2.0: Kontrolowanie kolejności Z elementów Stage
Co masz na myśli przez cca? –
Analiza korelacji kanonicznej? –
Co masz na myśli przez około? : P –