Randomize ? ou condition foireuse

Imports System.Threading

Module Module1

    Sub Main()

        Dim nombre, de1, de2, de3, de4, de5, de6, cpt As Integer

        Randomize()

        Console.WriteLine("Simulation de lancer de 6 dés")
        Console.WriteLine("Combien de fois voulez vous simuler le lancé de 6 dés ?")
        nombre = Console.ReadLine()

        While nombre > 0
            de1 = 1 + Rnd() * 6
            de2 = 1 + Rnd() * 6
            de3 = 1 + Rnd() * 6
            de4 = 1 + Rnd() * 6
            de5 = 1 + Rnd() * 6
            de6 = 1 + Rnd() * 6
            nombre -= 1
            Console.WriteLine("tirage numéro {0} en cours ", nombre)
            'Console.Write(" {0} {1} {2} {3} {4}{5}", de1, de2, de3, de4, de5, de6)
            If de1 = de2 = de3 = de4 = de5 = de6 Then
                cpt = cpt + 1
            End If
        End While
        Console.WriteLine("Les dés ont tous eu la même valeur {0} fois", cpt)
        Thread.Sleep(2000)
    End Sub

End Module


voici un algorithme tout con que j’avais en C et que j’ai passé en Vb
Problème : Même sur 1000000 tirages, je n’obtiens jamais tous les dés égaux, alors que le même algorithme en C me donne environ 130 fois les dés tous égaux. :aie:

Quelqu’un peut t’il m’aider ? Je débute en Vb (2008) (Comme si cela ne se voyait pas :mouarf: )

Ce n’est qu’une supposition mais la génération des nombres aléatoires peut être implémenté selon différents algos, cela peut expliquer cette différence de résultat.
L’idéal étant de l’implémenter soit même en C/VB puis de vérifier.

C’est ton If qui n’est pas bon. Même quand tous tes dés sont égaux, ça te renvoie False. Je ne saurais pas te dire avec certitude pourquoi, mais une chose est sûre : ta syntaxe n’est pas bonne.

Petite réécriture :

        Dim nombre, cpt As Integer

        Randomize()

        Console.WriteLine("Simulation de lancer de 6 dés")
        Console.WriteLine("Combien de fois voulez vous simuler le lancé de 6 dés ?")

        nombre = Console.ReadLine()

        Dim des(6) As Integer

        While nombre > 0
            For n = 0 To des.Length - 1
                des(n) = Math.Round(Rnd() * 5) + 1
            Next

            nombre -= 1

            Console.WriteLine("tirage numéro {0} en cours ", nombre)

            Dim allEquals As Boolean = True

            For n = 1 To des.Length - 1
                If (des(n) <> des(n - 1)) Then
                    allEquals = False
                    Exit For
                End If
            Next

            If (allEquals) Then
                cpt = cpt + 1
            End If

        End While
        Console.WriteLine("Les dés ont tous eu la même valeur {0} fois", cpt)
        Console.ReadLine()

Edité le 08/03/2009 à 19:47

Merci, ton code marche nikel.

Je ne comprend pas pourquoi il ne rentre pas dans mon IF, ça doit pas être la même syntaxe qu’en C au niveau des conditions.

En tout cas MERCI :wink:

Je ne sais pas comment il se débrouille pour évaluer le “a=b=c=d” mais en tout cas ça ne produit pas le résultat esconté. En VB.NET “correct”, je pense qu’il aurait fallu plus un truc du genre if (a = b AndAlso b = c AndAlso c = d).
Edité le 08/03/2009 à 22:08

Oui, ça marche avec andalso, je viens de vérifier :slight_smile:

Comme ça m’intriguait, je me suis attardé sur la question.

Le if (a = b = c = d) est en fait interprété comme : if ( (((a = b) = c) = d) ).

Le problème est que a = b renvoie un booléen, qui est casté implicitement en int (en VB.NET, False = 0 et True = -1). Il compare ensuite c à (a = b), donc à 0 ou -1, au lieu de le comparer à b. La condition ne alors être vérifiée que si tous les nombres sont égaux à -1.

Pour s’en convaincre, il suffit d’ajouter “Option Strict On” au début du programme, ce qui va désactiver les casts implicites. On a alors une erreur “Option Strict On disallows implicit conversions from ‘Boolean’ to ‘Integer’”.

D’ailleurs, d’une manière générale, je recommande d’activer l’option Strict quand on code en VB.NET :jap:

Apparemment, je suis le seul couillon à le faire en C, donc j’ai de la chance que ça marche.

Merci pour ton aide.