Jak mogę elegancko uzyskać konkretną liczbę (> 1) różnych, losowych elementów z kolekcji?Jak uzyskać określoną liczbę losowych elementów z kolekcji w Smalltalk?
Odpowiedz
To jest coś, co myślę, że wygląda bardziej lub mniej ładne, ale nie jest tak efektywny, jak to może być:
yourCollection asSet asOrderedCollection shuffled first: numberOfElements
Rozważmy następujący fragment kodu
sample: anInteger from: aCollection using: aGenerator
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: aGenerator.
sample add: element].
^sample asArray
Kilka uwag
Wyraźny generator: To jawnie używa danego generatora, tj. Instancji o numerze
Random
, którą nazwałemaGenerator
. Ze względów matematycznych, jeśli pobierasz próbki do swojej aplikacji, wszystkie powinny używać tego samego generatora w całym programie. Zapewni to także dodatkową korzyść: zapisz i później przywróć wersjęseed
, a będziesz w stanie odtworzyć poprzednie "losowe" zachowanie systemu, co jest dobre do testowania.No check dostępność: kod nie sprawdza, że jest możliwe, aby uzyskać żądaną próbkę, co byłoby, gdyby
aCollection
nie posiada przynajmniejanInteger
różnych elementów.Kod bez kodowania: Metoda powinna trafić do niektórych klas.
Na przykład:
Random >> sample: anInteger from: aCollection
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: self.
sample add: element].
^sample asArray
UPDATE
Oto innego podejścia:
Random >> remove: anInteger from: aCollection
| sample |
sample := OrderedCollection new: anInteger.
anInteger timesRepeat: [| index element |
index := aCollection size atRandom: self.
element := aCollection removeAt: index.
sample add: element].
^sample
Komentarz
Zwykle, gdy chcemy próbkować bez powtórzeń, chcemy również usunąć elementy z kolekcji, ponieważ losowo je wybieramy. W takich przypadkach często zdarza się, że zbiór nie zawiera powtórzeń.
Hmm, podoba mi się podejście "byo generator", ale jeśli kolekcja i rozmiar próbki są duże, możesz zostać zablokowany w oczekiwaniu na chwilę, aż generator ostatecznie wybierze "wolny" numer. –
@ AmosM.Carpenter dobry punkt. To, czego używam, jest bliższe drugiemu podejściu. –
Przepraszam za bycie prymitywnym, ale nie powinieneś używać '#removeIndex:' - to ma być prywatne. Używanie publicznej metody '#removeAt:' zamiast tego miałoby dodatkową korzyść w postaci odpowiedzi na usunięty element, co oznacza, że możesz pozbyć się dodatkowej zmiennej tymczasowej 'element' (tj. Po prostu wykonaj' sample add: (aCollection removeAt: index) ') .Obie te metody "usuwania" znajdują się w 'OrderedCollection', więc nie będzie działać z innymi typami kolekcji. –
- 1. Rozpakuj określoną liczbę elementów w Pythonie?
- 2. python - jak uzyskać liczbę aktywnych wątków uruchomionych przez określoną klasę?
- 3. Jak uzyskać pierwszą liczbę elementów N z tablicy
- 4. Jak uzyskać losową liczbę z hałasu atmosferycznego?
- 5. Jak odczytać określoną liczbę bajtów ze strumienia?
- 6. Jak uzyskać losowych wartości z tablicy w C#
- 7. Jak uzyskać tablicę losowych liter A-Z?
- 8. Jak uzyskać określoną wartość z obiektu System.Data.DataTable?
- 9. Jak mogę ograniczyć liczbę wyników o określoną kolumnę w postgreSQL?
- 10. Jak uzyskać liczbę usuniętych obiektów
- 11. Układanie elementów kolekcji w siatce
- 12. Python: jak uzyskać posortowaną liczbę elementów na liście?
- 13. Ciąg do Integer Smalltalk
- 14. Jak zachować najwyższą liczbę elementów tablicy w mongoDB?
- 15. Usunąć określoną grupę elementów w wektorze?
- 16. Jak zdobyć liczbę elementów w ObservableCollection z XAML?
- 17. Jak mogę znaleźć liczbę elementów w tablicy?
- 18. Jak uzyskać liczbę list z określonym elementem?
- 19. Jak sformatować liczbę całkowitą na określoną długość w javascript?
- 20. Jak uzyskać liczbę NSMutableDictionary w iphone?
- 21. Jak sformatować liczbę przecinkami i określoną dokładnością cyfr w Pythonie
- 22. Jak uzyskać określoną wartość z html w java?
- 23. Struktura danych do wybierania elementów losowych?
- 24. Uzyskaj łączną liczbę elementów w tablicy
- 25. Jak znaleźć liczbę elementów za pomocą jQuery
- 26. Jak uzyskać liczbę wyliczeń?
- 27. DRY - dodaj pewną liczbę elementów do końca tablicy, aż jej liczba osiągnie określoną wartość.
- 28. NASM - Get liczbę elementów w stosie
- 29. Jak odwzorować liczbę kolekcji na podmiot z fluent-nhibernate
- 30. WPF Wiązanie do określonych elementów w kolekcji
Bardzo elegancki. Jedyny sposób, jaki mogłem zaobserwować, aby poprawić efektywność (która zazwyczaj nie byłaby problemem, ale niektórzy ludzie się na niej odwalali ...) to przetasowanie _indices_ zamiast kolekcji (ponieważ byłoby mniej indeksów) , a następnie użyj czegoś takiego jak '#atAll:', aby wybrać te losowe indeksy ze zbioru (nadal potrzebujesz '# asSet', jeśli chcesz je _distinct_). –