Tirage de carte (réponse)
Bonjour.
Je suis nouveau sur ce forum et aussi débutant en swift.
J'ai repris votre code et effectivement, il tourne en boucle. En cause la ligne 46 :
46 : while carteLen(tombées:Tombées) < 54
Ce n'est pas 54 mais 52.
46 : while carteLen(tombées:Tombées) < 52
Cette algorithme au tirage pour 52 cartes fonctionne mais si vous aviez une quantité de cartes à tirer très supérieur, il sera très lent.
En effet vers la fin du traitement la fonction aléatoire proposera des cartes qui ont déjà été tirées ce qui obligera à recommencer le tirage.
Je vous propose un code plus rapide et aussi plus court.
La fonction "battresLesCartes" crée d'abord un tableau de cartes "triées".
Après chaque tirage elle récupère la valeur de la carte tirée du tableau "triées" pour l'ajouter dans celui du tableau des "battues" enfin elle supprime la carte tiré du jeux des cartes "triées", l'argument de la fonction tirage "arc4random_uniform()" est décrémenter.
A la dernière carte "triées", il est inutile de faire le tirage d'où une boucle for un peu plus petite et la ligne 17.
Il n'y a donc plus qu'un nombre nécéssaire d'appel à la fonction aléatoire.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
// main.swift
// SwiftCommandeEnLigne
import Foundation
func battreLesCartes (_ nombre: Int) -> Array<Int> {
var battues: Array<Int> = []
if nombre > 0 {
var tirage: Int
var triés: Array<Int> = []
for i in 1...nombre {triés.append(i)}
for i in stride(from: nombre, to: 1, by: -1) {
tirage = Int(arc4random_uniform(UInt32(i)))
battues.append(triés[tirage])
triés.remove(at: Int(tirage))
}
battues.append(triés[0])
}
return battues
}
// Début du programme main
var battues = battreLesCartes(52)
print ("Nombre de cartes ~> \(battues.count)")
print ("Tirage ~> \(battues)")
battues = battreLesCartes(0)
print ("Nombre de cartes ~> \(battues.count)")
print ("Tirage ~> \(battues)")
battues = battreLesCartes(56879)
print ("Nombre de cartes ~> \(battues.count)")
print ("Tirage ~> \(battues)") |
Cependant ce code consomme un peu plus de mémoire que le votre pendant son exécution.
D'autre part, j'ai retiré l'élément zéro que vous utilisez pour le résultat de votre tirage.
Pour le remettre, ligne 6 : var battues: Array<Int> = [0]
Cordialement.