Exercice créer et détruire bots

Bonjour à tous,
j’essai de faire l’exercice créer et détruire un bots du cours apprendre la pop en Swift.
Je dois créer une fonction pour le lancer de dés. J’ai repris la fonction du nombre aléatoire en changeant les valeurs :

    func rollTheDices(player:String) -> Int {
    let throwValue = Math.nombreAleatoire(comprisEntre: 1, et: 12)
    print("\(player), lance les dés ... \(throwValue)")
    return throwValue
}

Seulement j’ai un souci quand j’exécute le jeu, à certain lancé j’ai le chiffre 13 qui sort et je ne comprends pas pourquoi.
Quelqu’un serait-il m’aiguiller sur mon erreur ?

Merci d’avance

Salut.m @mushi-mushi
Pour t’aider il va nous falloir un peu plus de code.
Et à mon avis la réponse sera dans la fonction Math.nombreAleatoire()

Pense à mettre en page tes commentaires. Ça aide…

Effectivement je viens de vérifier et il y avait bien un soucis dans le code de la fonction de génération de nombre aléatoires que j’ai inclue dans le projet.
C’est corrigé et mis à jour sur GitHub, merci pour l’info :+1:

Utilise plutôt le système de tirage aléatoire natif de Swift :

let tirage = Int.random(in: 1...12)

C’est ce que j’ai fait dans la fonction avec le nom francais justement. Quand j’avais créé le projet en 2017 j’avais utilisé arc4random_uniform et je me suis mélangé dans le calcul min/max

@alexandre.cane Merci pour ton retour je ferais attention la prochaine fois, j’avais choisis texte preformaté, mais ca n’a pas l’air d’etre ça, tu serais me dire comment faire ?

@mbritto Merci, je vais aller voir le changement

@Draken Effectivement c’est ce que propose Maxime dans la correction.

let dicesValue:Int = Int.random(in: 1...6) + Int.random(in: 1...6)

Il ne savait pas si le fait de faire de 1 à 12 ou deux fois de 1 à 6 avait une incidence sur les probabilités

Bah, cela n’as pas vraiment d’importance. Le plus important c’est que cela soit cohérent par rapport au jeu. Dans un autre topic j’ai parlé de mon expérience de joueur de jeux de rôles sur table (les jeux de sociétés bizarres des années 90, avant l’ère des jeux vidéos, qui ont donné naissance aux MMORPG comme World Of Warcraft).

L’ancêtre de tous ces jeux, Donjon&Dragon utilise de nombreux types de dés, pour simuler le hasard des affrontements. Par exemple (de mémoire) : un couteau fait 1d4 de dommage, une épée courte 1d8, une épée longue 1d12, un sort de boule de feu 2D20 de dégâts, etc …

Tout joueur de Donjon&Dragon avait une trousse pleine de dés rigolos de différentes formes : D4, D6, D8, D10, D12, D16, D20. Il y avait même des D100 avec 100 faces, pour tirer des probabilités directement !

Les jeux de rôles papier ne sont pas guère pratiqués de nos jours, mais on peut quand même acheter des lots de dés spéciaux sur Amazon.

1 « J'aime »

Pour fair simple,
à ma connaissance,
oui la probabilité n’est pas la même.
en effet avec 1 dé de 12 faces vous avez 1 chance sur 12 de tirer 1 chiffre hors avec 2 dés vous avez plus de chance de faire un 7 que de faire un 2 (et 0 de faire un 1…).
1 + 1 = 2
1 + 2 = 3
2 + 1 = 3
1 + 3 = 4
2 + 2 = 4
3 + 1 = 4
1 + 4 = 5
2 + 3 = 5
3 + 2 = 5
4 + 1 = 5
… etc, je pense que vous avez compris …

C’est le principe du CRAPS

1 « J'aime »

1 code vaut milles mots pour étayer ma thèse :wink:

→ avec l’AppConsole de @mbritto

dans Main :

var numberRound1de:[Int] = []
var numberRound2des:[Int] = []
var number:Int
var numberToSearch:Int = 7

for _ in 1...10 {
    numberRound1de = []
    numberRound2des = []
    for _ in 1...1000 {
        var tourIn:Int = 0
        repeat {
            number = Math.nombreAleatoir1des11Faces()
            tourIn += 1
        } while number != numberToSearch
        numberRound1de.append(tourIn)
    
        tourIn = 0
        repeat {
            number = Math.nombreAleatoir2des()
            tourIn += 1
        } while number != numberToSearch
        numberRound2des.append(tourIn)
    }
    print("La moyenne de lancés avec 1 dé pour obtenir le \(numberToSearch) est de : \(Math.averageOf(Array: numberRound1de)) lancés")
    print("La moyenne de lancés avec 2 dés pour obtenir le \(numberToSearch) est de : \(Math.averageOf(Array: numberRound2des)) lancés \n")
}

dans Math :

static func nombreAleatoir2des() -> Int {
    return Int(Int.random(in: 1...6) + Int.random(in: 1...6))
}

static func nombreAleatoir1des11Faces() -> Int {
    return Int(Int.random(in: 2...12))
}

static func averageOf(Array:[Int]) -> Double {
    var somme:Double = 0
    
    for i in 0..<100 {
        somme += Double(Array[i])
    }
    
    return somme/100
}

Résultat :

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 11.07 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.18 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 11.66 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.96 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 12.24 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.23 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 9.71 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.69 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 12.89 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.36 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 11.71 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 5.89 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 11.91 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.54 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 11.73 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.55 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 9.72 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 5.48 lancés

La moyenne de lancés avec 1 dé pour obtenir le 7 est de : 10.75 lancés
La moyenne de lancés avec 2 dés pour obtenir le 7 est de : 6.3 lancés

On remarquera que le résultat pour le chiffre 7 tant vers le nombre de face du dé


La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 11.21 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 40.3 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 10.09 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 35.55 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 10.67 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 36.01 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 11.03 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 41.12 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 10.62 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 36.9 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 11.95 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 34.8 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 12.08 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 39.0 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 10.74 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 35.17 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 11.36 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 29.85 lancés

La moyenne de lancés avec 1 dé pour obtenir le 2 est de : 10.35 lancés
La moyenne de lancés avec 2 dés pour obtenir le 2 est de : 35.59 lancés

Je vous laisse comparer pour le chiffre 2 (et les résultats devrais être les mêmes pour le nombre 12)

3 « J'aime »

Plus simple et plus parlant. C’est de l’UIKit, avec un affichage uniquement dans la console de débugage.

import UIKit

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    
    tests()
    
  }


  func tests () {
    var tableau_1D12 = Array(repeating: 0, count: 12)
    var tableau_2D6  = Array(repeating: 0, count: 12)
    for _ in 1 ... 12000 {
      let tirage_1D12 = Int.random(in: 1 ... 12)
      let tirage_2D6 = Int.random(in: 1 ... 6) + Int.random(in: 1 ... 6)
      tableau_1D12[tirage_1D12-1] += 1
      tableau_2D6[tirage_2D6-1] += 1
    }
    
    print ("D12 : ")
    for index in 0 ..< 12 {
      let nbApparitions = tableau_1D12[index]
      print ("Tirage : ", index+1, " => ", nbApparitions )
    }
    
    print ("")
    print ("2D2 : ")
    for index in 0 ..< 12 {
      let nbApparitions = tableau_2D6[index]
      print ("Tirage : ", index+1, " => ", nbApparitions )
    }
    
  }
  
}

Affichage :

D12 :
Tirage : 1 => 989
Tirage : 2 => 1050
Tirage : 3 => 1000
Tirage : 4 => 962
Tirage : 5 => 1068
Tirage : 6 => 995
Tirage : 7 => 982
Tirage : 8 => 1001
Tirage : 9 => 982
Tirage : 10 => 979
Tirage : 11 => 1060
Tirage : 12 => 932

2D2 :
Tirage : 1 => 0
Tirage : 2 => 329
Tirage : 3 => 669
Tirage : 4 => 967
Tirage : 5 => 1316
Tirage : 6 => 1599
Tirage : 7 => 2035
Tirage : 8 => 1657
Tirage : 9 => 1369
Tirage : 10 => 1012
Tirage : 11 => 715
Tirage : 12 => 332

On voit tout de suite que :

  1. Le tirage 1D12 est a peu prés linéaire, avec quelques petites variations statistiques normales.

  2. Le chiffre 1 ne sort jamais avec la formule 2D6 (c’est logique, mais je n’y avais pas pensé avant de faire le test)

  3. Les probabilités ne sont absolument pas équivalentes avec 2D6, mais suivent une progression en forme de courbe de gauss, dont la valeur maximale se situe à la valeur 7. Au tirage, le 7 apparait SIX FOIS plus souvent que le 2 ou le 12 !!!

4 « J'aime »

On ne peut pas nier que c’est beau les mathématiques quand même :grin:

2 « J'aime »

@Draken, @Guerno, ça c’est de la réponse. Merci à vous deux je crois que Maxime va avoir sa réponse maintenant et moi aussi du coup. :+1:
Bonne soirée à vous

2 « J'aime »

Les quoi ? Ah oui, ce truc abstrait sans rapport avec l’univers de tous les jours, que je ne comprenais pas du tout en classe. Il a fallu que je me mette à l’informatique, pour commencer à vraiment comprendre les maths. C’est très mal expliqué à l’école, du moins pour les gens comme moi qui ne peuvent apprendre les choses qu’en les expérimentant et en jouant avec, pour faire des trucs avec …

Comme par exemple, utiliser une équation du second degré pour calculer la trajectoire d’un projectile, ou une équation géométrique pour calculer la surface de collision d’un sprite.

3 « J'aime »