Obtenez de l'aléatoire des éléments de la matrice en swift
J'ai un tableau comme:
var names: String = [ "Peter", "Steve", "Max", "Sandra", "Roman", "Julia" ]
J'aimerais avoir 3 éléments aléatoires à partir de ce tableau. Je suis venue à partir de C#, mais en swift je ne suis pas sûr où commencer. Je pense que je devrais aléatoire de la matrice d'abord et ensuite choisir les 3 premiers éléments, par exemple?
J'ai essayé de mélanger avec l'extension suivante:
extension Array
{
mutating func shuffle()
{
for _ in 0..<10
{
sort { (_,_) in arc4random() < arc4random() }
}
}
}
mais il dit ensuite: "'() "n'est pas convertible à" [Int]'" au lieu de "shuffle()".
De sélection d'un certain nombre d'éléments que j'utilise:
var randomPicks = names[0..<4];
qui semble bon jusqu'ici.
Comment shuffle? Ou quelqu'un a une meilleure/plus élégante solution pour cela?
Voir stackoverflow.com/questions/24026510/... pour une meilleure lecture aléatoire de la méthode.
Merci, j'ai utilisé la mutation de la méthode d'extension de la accepté anaswer maintenant pour le battage.
Oui, il y a de mieux/plus élégant solutions: plein de brassage n'est pas optimale si vous avez besoin de 4 éléments aléatoires de 10, ramasser les un par un en coûte seulement 4
À l'aide de
Merci, j'ai utilisé la mutation de la méthode d'extension de la accepté anaswer maintenant pour le battage.
Oui, il y a de mieux/plus élégant solutions: plein de brassage n'est pas optimale si vous avez besoin de 4 éléments aléatoires de 10, ramasser les un par un en coûte seulement 4
arc4random_uniform
, mais plein de brassage des coûts 9 arc4random_uniform
.À l'aide de
sort
à battre comme cela ne fonctionne tout simplement pas. Tri intentionnellement n'a que peu de comparaison possible, et certainement pas assez pour atteindre un décent shuffle.OriginalL'auteur Patric | 2014-12-02
Vous devez vous connecter pour publier un commentaire.
Xcode 9 • Swift 4
Aire de jeux de tests
Xcode 8.3.1 • Swift 3.1
Merci pour la réponse rapide... Mais je pense que vous avez supprimé l'Int extension en raison de laquelle indexRandom() la méthode donnera l'erreur.
OriginalL'auteur Leo Dabus
Je ne. Algorithmiquement mieux que l'on a accepté la réponse, qui ne comptent-1
arc4random_uniform
opérations pour un plein shuffle, nous pouvons simplement prendre n valeurs dans narc4random_uniform
opérations.Et en fait, j'ai eu deux façons de faire mieux que l'on a accepté la réponse:
Meilleure solution
Meilleure solution
La solution suivante est deux fois plus rapide que la précédente.
pour Swift 3.0 et 3.1
pour Swift 3.2 et 4.x
Utilisation:
OriginalL'auteur Cœur
Swift 4.1 et au-dessous de
Swift 4.2 et au-dessus de
OriginalL'auteur Prashant Gaikwad
Vous pouvez également utiliser arc4random() il suffit de choisir trois éléments du Tableau. Quelque chose comme ceci:
C'est juste un exemple, vous pourriez aussi inclure logique de la fonction pour obtenir un nom différent pour chacun.
UInt32
(le retour dearc4random()
) en (32 bits signé)Int
, résultant en un négatif d'index de tableau; (c) il pourrait en résulter, par exemple, "Pierre", "Steve", "Pierre", comme il n'y a pas de code pour éviter les pics de la même élément.Ouais, merci pour la réponse, mais ce n'est pas vraiment fait en sorte que seuls les éléments sont retournés une fois (que je n'ai pas d'état directement, mais est ce que je suis à la recherche d')
OriginalL'auteur akshay
Vous pouvez définir une extension sur le Tableau:
Si la table initiale peut avoir des doublons, et que vous voulez l'unicité de la valeur:
OriginalL'auteur Carpsen90