none
L'opération arithmétique a provoqué un dépassement de capacité. RRS feed

  • Question

  • Bonjour

    j'essaie de tirer aléatoirement des nombres entiers compris entre un milliard et 999 milliards sans succès même en déclarant mes variables en Ulong. Quelqu'un saurait-il pourquoi?

    merci

    ######### code de la classe############""

    Public

     

    Class GenNombres

     

    Inherits Object

     

    Public Shared RndGen As System.Random = New System.Random

    #Region

     

    "Gnrer un nombre ou une collection de nombres alatoires"

     

    ''' <summary>

     

    ''' Gnrer un nombre respectant certaines contraintes

     

    ''' </summary>

     

    ''' <param name="low">Valeur minimale</param>

     

    ''' <param name="high">Valeur maximale</param>

     

    ''' <returns>Un nombre</returns>

     

    ''' <remarks>Le nombre retourn sera entier</remarks>

     

    Public Shared Function GenNbre(ByVal low As Long, _

     

    ByVal high As Long)

     

    Dim NbreTire As ULong

    NbreTire = RndGen.Next(low, high)

     

    Return NbreTire

     

    End Function

    #End

     

    Region

    End

     

    Class

    etc.

    ###########code d'une fonction de ma form1##########

     

    Dim NbreEnChiffres As ULong

     

    Dim Min As Long = 1

     

    Dim Max As Long = 20

    Private

     

    Sub Generation()

    TxtBxProposition.Text =

    ""

     

    NbreEnChiffres = CULng(GenNombres.GenNbre(Min, Max))

    etc

    lundi 12 juillet 2010 14:37

Réponses

  • Bonjour,

    La méthode Random.Next() est limité à la taille maximale d'un entier sur 32 bit signé (2^31 = envrion 2 milliards). Si vous avez besoin de plus grand nombre, utilisez la méthode Random.NextDouble() qui permet de retourner un nombre flottant sur 64-bit compris entre 0 et 1. Après, appliquez une multiplication...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Alex Petrescu mercredi 14 juillet 2010 12:39
    mardi 13 juillet 2010 08:28
    Modérateur

Toutes les réponses

  • Bonjour,

    Sur quelle ligne obtenez vous l'exception ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 12 juillet 2010 15:49
    Modérateur
  • Bonjour et merci d'avance pour votre aide

    Cordialement

    Pascal

    'Dans la classe GenNombres j'ai écrit ça :
    Public Shared RndGen As System.Random = New System.Random
    Public Shared Function GenNbre(ByVal low As ULong, ByVal high As ULong)
     Dim NbreTire As ULong
     NbreTire = (RndGen.Next(low, high))' C'est ici qu'apparaît le dépassement de capacité.........
     Return NbreTire
    End Function
    'Dans une forme Frm_nbre_en_lettres ou se trouvent des boutons radios permettant de faire varier Min et Max tout se passe bien jusqu'aux millions, puis ça bug avec les milliards.
    Private Sub RdBtnMillions_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RdBtnMillions.CheckedChanged
            Min = 1000000
            Max = 999999999
            If RdBtnChiffres.Checked = True Then ' on veut écrire en chiffres
                TxtBxProposition.SelectionFont = New Font("Tahoma", 18, FontStyle.Regular)
                LblAfficheLeTaff.Font = ChangeFontSize(TxtBxProposition.Font, 14)
            Else
                TxtBxProposition.SelectionFont = New Font("Tahoma", 14, FontStyle.Regular)
                LblAfficheLeTaff.Font = ChangeFontSize(TxtBxProposition.Font, 18)
            End If
        End Sub
        Private Sub RdBtnMilliards_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RdBtnMilliards.CheckedChanged
            Min = 1000000000
            Max = 9999999999
            If RdBtnChiffres.Checked = True Then ' on veut écrire en chiffres
                TxtBxProposition.SelectionFont = New Font("Tahoma", 18, FontStyle.Regular)
                LblAfficheLeTaff.Font = ChangeFontSize(TxtBxProposition.Font, 13)
            Else
                TxtBxProposition.SelectionFont = New Font("Tahoma", 13, FontStyle.Regular)
                LblAfficheLeTaff.Font = ChangeFontSize(TxtBxProposition.Font, 18)
            End If
        End Sub
    'J'ai donc essayé de déclarer les variables en long puis Ulong y compris pour Min et Max et NbreTire sans succés....
    ' Ci-dessous la fonction qui est appelée pour créer les nombres dans les limites Min Max:

    Private Sub Generation()
            TxtBxProposition.Text = ""
            'créer une paire question / soluce
            NbreEnChiffres = CULng(GenNombres.GenNbre(Min, Max))
            If Not String.IsNullOrEmpty(NbreEnChiffres) Then
                NbreEnLettres = Spell(NbreEnChiffres).ToLower
                If CheckBoxRef90.Checked = True Then
                    NbreEnLettres = Replace(NbreEnLettres, " ", "-").ToLower
                End If
            Else
                NbreEnLettres = String.Empty
            End If
            'afficher l'un ou l'autre en fonction du taff
            If RdBtnChiffres.Checked = True Then ' on veut écrire en chiffres
                LblAfficheLeTaff.Text = NbreEnLettres 'donc on affiche en lettres
                lblCheat.Text = Format(NbreEnChiffres, "### ### ### ##0")
            Else
                LblAfficheLeTaff.Text = Format(NbreEnChiffres, "### ### ### ##0") 'sinon on affiche en chiffres
                lblCheat.Text = NbreEnLettres
            End If
            'On bloque le bouton de génération de nombre 
            BtnGenerer.Enabled = False
            GrpBxChoixDuTaff.Enabled = False
            BtnProposer.Enabled = True 'et on rend celui pour proposer accessible
            TxtBxProposition.Focus()
            Me.AcceptButton = BtnProposer
        End Sub

     

    mardi 13 juillet 2010 08:02
  • En fait je crois que c'est la classe Random qui est limitée car si je fais à l'ancienne :

    Randomize()

    NbreTire = high * Rnd() + low

    à la place de

     

     

    'NbreTire = (RndGen.Next(low, high))

    Cela ne pose plus de problème........

    mardi 13 juillet 2010 08:18
  • Bonjour,

    La méthode Random.Next() est limité à la taille maximale d'un entier sur 32 bit signé (2^31 = envrion 2 milliards). Si vous avez besoin de plus grand nombre, utilisez la méthode Random.NextDouble() qui permet de retourner un nombre flottant sur 64-bit compris entre 0 et 1. Après, appliquez une multiplication...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Alex Petrescu mercredi 14 juillet 2010 12:39
    mardi 13 juillet 2010 08:28
    Modérateur
  • Merci pour l'info. Dommage cette limitation !

    lundi 19 juillet 2010 20:59