XL 2019 valeur aléatoire à deux décimale

Sheldor

XLDnaute Occasionnel
Bonjour,

jusqu'à tout à l'heure je pensais très simple de générer des valeurs entre 0 et 1 avec deux chiffres après la virgule avec cell.Value = (Int(Rnd() * 100)) / 100
eh bien ça ne marche pas du tout... soit je suis à côté de la plaque soit c'est l'ordi qui fonctionne comme ça (comme quand on fait 4.3-4.2 ça fait pas 0.1) mais j'ai plein de chiffres après la virgule que je ne veux pas...

si quelqu'un avait une idée...
très grand merci...

nico
 

Pièces jointes

  • ajout_centieme.xlsm
    17 KB · Affichages: 5

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Sheldor,
XL affiche par défaut en décimal mais il y a souvent une erreur d'arrondi dû à la précision de calcul, c'est pour ça qu'on trouve du 0.210000001 ou du 0.20999999.
1697202031500.png

Si vous voulez vraiment que 2 chiffres après la virgule, j'ai trouvé sur le net cette astuce en transformant en chaine de caractère, qui supprime l'arrondi, puis en remettant en décimal :
VB:
Cells(L, C) = CDbl(CStr(Int(Rnd() * 100) / 100))
1697202147614.png

ou encore :
Code:
Cells(L, C) = CDbl(CStr(Round(Rnd, 2)))
qui donne le même résultat.

Ou encore plus "propre" :
VB:
Cells(L, C) = Application.RandBetween(0, 100) / 100
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
C'est à dire que tu ne veux que 100 valeurs differentes (0.00 à 0,99)
Dans ce cas établir :
une colonne A avec 100 fois la formule =ALEA()
De façon contiguë une colonne B
=RANG(A1; A$1:A$100)/100 recopie 100 fois vers le bas

Il suffira alors de récupérer les n premières valeurs souhaitées de cette colonne
garanti sans doublons

Touche F9 pour un nouveau reassortiment
 

patricktoulon

XLDnaute Barbatruc
re
pour préciser ma question
si on accepte les doublons
VB:
Sub Boutonz_Cliquer()
    Randomize
    Selection.NumberFormat = "#0.00"
    For Each cell In Selection
        cell.Value = Round(Rnd * 1, 2)
    Next
End Sub

si on accepte pas les doublons
version 1
Code:
'version2 sans doublons
Sub Bouton1_Cliquer()
    Randomize
    ReDim t(1 To Selection.Cells.Count)
    Selection.NumberFormat = "#0.00"
    Do While i < UBound(t)
        valeur = Round(Rnd * 1, 2)
        x = Application.IfError(Application.Match(valeur, t, 0), 0)
        If x = 0 Then i = i + 1: t(i) = valeur
    Loop
    Selection = Application.Transpose(t)
End Sub

et la version 3 qui pour moi et la plus intelligente
c'est simplement de mélanger des nombre qui sont dans l'ordre au départ

Code:
'version 3 sans doublons en mélangeant simplement dans le désordre
Sub Bouton1_Cliquer()
    Selection.NumberFormat = "#0.00"
    t = Evaluate("ROW(1:99)")
    For i = 1 To UBound(t): x = Int(1 + (Rnd * (UBound(t) - 1))): tp = t(i, 1): t(i, 1) = t(x, 1): t(x, 1) = tp: Next
    For i = 1 To Selection.Rows.Count: t(i, 1) = t(i, 1) / 100: Next
    Selection = t
End Sub
A noter qu'en aucun cas j'utilise une collection ou un dictionnaire
voila donc version 2 et 3 pas de doublons possibles
 

patricktoulon

XLDnaute Barbatruc
Bonjour Patrick,

J'ai traduit ça comme "je ne veux que deux chiffres après la virgule", faire "NumberFormat = "#0.00"" ne modifie que l'affichage, pas la valeur.
ha lalalala! @sylvanu

c'est par ce que ces cellules était déjà formatée plus de deux décimales
de part le fait qu'il y a injecté au moins une fois un nombre a plus de 2 décimales que Excel n'a pas pu arrondir a une décimale inférieur
;)


dans mes codes je vais de 1 à 99 puis diviser par 100
donc les décimales ne peuvent qu'en compter deux
;)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
dans mes codes je vais de 1 à 99 puis diviser par 100
donc les décimales ne peuvent qu'en compter deux
Je n'ai fait que tester votre code ( premier code du post #6)
Cela donne ça :
1697205936466.png

Mais si on remet en standard, on trouve ça :
1697205958620.png

Mais si le demandeur ne veut que 2 décimales, même en standard, ça ne marche pas.
C'est tout. Rien de plus.
Ce qui est quelque peu déroutant, c'est que la même chose en VBA et en XL ne donne pas la même chose en résultat :
1697206365216.png

Le tout étant en affichage standard, bien sur.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Je dis simplement que "Int(Rnd() * 100) / 100" en VBA ne donne pas la même chose que "ENT(alea()*100)/100", en XL on a toujours que deux décimales alors qu'en VBA il restitue une valeur qui a son erreur de résolution, d'où les 00001 ou les 99999.
Peut être qu'en VBA l'algo de calcul d'un nombre aléatoire n'est pas le même qu'en XL.
 

Statistiques des forums

Discussions
315 090
Messages
2 116 104
Membres
112 661
dernier inscrit
ceucri