Załóżmy, że mam tablicę i chcę wybrać jeden element losowo.
Jaki byłby najprostszy sposób to zrobić?
Oczywistym sposobem byłoby array[random index]
. Ale może jest coś takiego jak rubin array.sample
? A jeśli nie, można stworzyć taką metodę za pomocą rozszerzenia?
array[random number from 0 to length-1]
, ale nie mogę znaleźć sposobu szybkiego wygenerowania losowej liczby całkowitej, gdybym nie został zablokowany, zapytałbym ją o przepełnienie stosu :) Nie chciałem zanieczyszczać pytania pół rozwiązaniami, kiedy może coś jak rubyarray.sample
Odpowiedzi:
Swift 4.2 i wyżej
Nowy Zalecane podejście jest wbudowany w metodzie na protokole kolekcji:
randomElement()
. Zwraca opcjonalne, aby uniknąć pustej skrzynki, którą wcześniej zakładałem.Jeśli nie utworzysz tablicy i nie masz gwarantowanej liczby> 0, powinieneś zrobić coś takiego:
Swift 4.1 i poniżej
Aby odpowiedzieć na twoje pytanie, możesz to zrobić, aby uzyskać losowy wybór tablicy:
Castingi są brzydkie, ale uważam, że są wymagane, chyba że ktoś inny ma inny sposób.
źródło
man arc4random
i stackoverflow.com/questions/10984974/...removeRandomElement()
funkcjęrandomElement()
. Zostanie modelowanyremoveFirst()
, ale usunie obiekt o losowym indeksie.0..<array.count
(z wielu powodów, z których najważniejszym jest to, że nie działa na plastry i jest podatny na błędy). Możesz zrobićlet randomIndex = array.indices.randomElement()
, a następnielet randomElement = array.remove(at: randomIndex)
. Możesz nawet wstawić to dolet randomElement = array.remove(at: array.indices.randomElement())
.Opierając się na tym, co powiedział Lucas, możesz utworzyć rozszerzenie klasy Array w następujący sposób:
Na przykład:
źródło
T
zmieniono nazwę naElement
.guard
sprawdzić, czy tablica jest pusta, a następnie zwrócićnil
.arc4random
powoduje, że wszelkie zyski stają się zupełnie nieistotne. Zaktualizowałem odpowiedź.Wersja Swift 4 :
źródło
startIndex != 0
W Swift 2.2 można to uogólnić, dzięki czemu mamy:
Po pierwsze, implementacja
random
właściwości statycznej dlaUnsignedIntegerType
s:Następnie dla
ClosedInterval
s zUnsignedIntegerType
granicami:Następnie (nieco bardziej zaangażowany), dla
ClosedInterval
s zSignedIntegerType
granicami (przy użyciu metod pomocniczych opisanych poniżej):... gdzie
unsignedDistanceTo
,unsignedDistanceFromMin
iplusMinIntMax
pomocnika metody mogą być realizowane w następujący sposób:Wreszcie dla wszystkich kolekcji, w których
Index.Distance == Int
:... które można trochę zoptymalizować dla liczb całkowitych
Range
:źródło
Do rozszerzenia możesz także użyć wbudowanej funkcji losowej () Swift:
źródło
Kolejna sugestia dotycząca Swift 3
źródło
Odpowiadają inni, ale z obsługą Swift 2.
Swift 1.x
Swift 2.x
Na przykład:
źródło
Alternatywna implementacja funkcjonalna z opcją sprawdzania pustej tablicy.
źródło
Oto rozszerzenie tablic z opcją sprawdzania pustej tablicy dla większego bezpieczeństwa:
Możesz użyć tego tak prostego :
Jeśli wolisz Framework, który ma również kilka przydatnych funkcji, sprawdź HandySwift . Możesz dodać go do swojego projektu za pośrednictwem Kartaginy, a następnie użyć go dokładnie tak, jak w powyższym przykładzie:
Dodatkowo zawiera również opcję uzyskania wielu losowych elementów jednocześnie :
źródło
Szybki 3
importuj GameKit
źródło
Swift 3 - prosty, łatwy w użyciu.
Utwórz tablicę
Utwórz losowy kolor
Ustaw ten kolor na swoim obiekcie
Oto przykład z
SpriteKit
projektu aktualizującegoSKLabelNode
losowoString
:źródło
Jeśli chcesz mieć więcej niż jeden losowy element z tablicy bez duplikatów , GameplayKit zapewnia:
Masz kilka możliwości losowości, zobacz GKRandomSource :
źródło
Uważam, że użycie GKRandomSource.sharedRandom () GameKit działa dla mnie najlepiej.
lub możesz zwrócić obiekt o wybranym losowym indeksie. Upewnij się, że funkcja najpierw zwraca łańcuch, a następnie indeks tablicy.
Krótko i na temat.
źródło
Collection
Teraz jest wbudowana metoda :Jeśli chcesz wyodrębnić
n
losowe elementy z kolekcji, możesz dodać takie rozszerzenie:A jeśli chcesz, aby były unikalne, możesz użyć a
Set
, ale elementy kolekcji muszą być zgodne zHashable
protokołem:źródło
Najnowszy kod swift3 wypróbuj go dobrze
źródło
Odkryłem zupełnie inny sposób, korzystając z nowych funkcji wprowadzonych w Swift 4.2.
zadeklarowaliśmy funkcję z parametrami pobierającymi tablicę ciągów i zwracającą ciąg.
Następnie bierzemy ArrayOfStrings w zmiennej.
Zasadniczo tasuje tablicę ciągów, a następnie losowo wybiera liczbę z całkowitej liczby zliczeń, a następnie zwraca losowy indeks przetasowanej tablicy.
źródło