XL 2010 Creer tableau avec chiffres aleatoire

chubbaccaa

XLDnaute Nouveau
Bonsoir a tous , je cherche a faire un tableau de 40X40 cases
dans ces 1600 cases , je voudrez y mettre des chiffres compris entre 1 et 1600 , le tout aléatoirement
Jusqu'à maintenant j'arrive a rentré tout ces chiffres aléatoirement mais j'ai des doublons et il ne m'en faut pas
il faut que chaque cases est un chiffre diffèrent

Voila la formule que j'ai écrit dans A1 : =ALEA()*(1-1600)+1600

Je ne trouve as la solution , cela fait plusieurs jours que je cherche mais la , je sèche o_O

Quelqu'un peut il me dire ce qu'il ne va pas
Merci
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Dranreb , @mapomme , @sylvanu

je reviens aujourd'hui sur un point qui me tracasse les neurones( j'en ai 2) 🤣

j'ai fait une version avec melange (codé à ma façon )

alors c'est drôlepar ce que le problème c'est que
ca marche tout le temps alors que tot ou tard je devrait entendre rugir le beep de message d'erreur "l'indice n'appartient pas à la selection"( au passage le beep sur W10 est pourri )
sauf ça n'arrive jamais
je m'explique dans les commentaires

VBA aurait il une IA 🤣
VB:
Sub test()
  'Application.ScreenUpdating = False
  Cells.ClearContents
   Dim tbl(1 To 40, 1 To 50), Lig&, Col&, I&, X, c1, c2, l1, l2, tim#
    Lig = 1: Col = 1
    tim = Timer
    For I = 1 To (UBound(tbl) * UBound(tbl, 2))
        tbl(Lig, Col) = I
        Col = Col + 1
        If I Mod UBound(tbl, 2) = 0 Then Col = 1: Lig = Lig + 1
    Next
   
   For I = 1 To (UBound(tbl) * UBound(tbl, 2))
        l1 = 1 + Int(Rnd * UBound(tbl)): c1 = 1 + Int(Rnd * UBound(tbl, 2))
        l2 = 1 + Int(Rnd * UBound(tbl)): c2 = 1 + Int(Rnd * UBound(tbl, 2))
        X = tbl(l1, c1): tbl(l1, c1) = tbl(l2, c2): tbl(l2, c2) = X
    Next
 'Question:
    'ci dessus je boucle  autant de tour que de case dans le tableau
    'j'utilise
    'L1 = 1 + Int(Rnd * UBound(tbl)) 'pour un idex ligne au hasard
    'c1 = 1 + Int(Rnd * UBound(tbl, 2))'pour un index colonne au hasard
    'pareil pour L2 et C2
    'donc!!!
    ' si jamais  le rnd*ubound(tbl) pour les lignes ou ubound(tbl,2)pour les colonnes me sort le max
    'donc avec le +1 ,ca devrait  déclecndher une erreur
    'ce qui est drole c'est que ca n'arrive jamais
    ' j'ai testé 500 fois
   

    Feuil1.Cells(1, 1).Resize(UBound(tbl), UBound(tbl, 2)) = tbl
    MsgBox Format(Timer - tim, "#0.00000 sec")
End Sub

y a que moi pour venir chercher et obtenir une erreur et non une solution sur le forum 🤣😂😅🤣
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour @Dranreb , @mapomme ,@patricktoulon ,
Moi je suis un peu "bourrin", j'ai donc fait un fichier avec en colonne A sur 1 000 000 lignes :
VB:
=ent(1600*alea())
et dans une cellule :
Code:
=NB.SI(A:A;1600)
Et ben ... j'obtiens 0. Même en recalculant plusieurs fois.
Donc la probabilité qu'une formule du type =ent(N0*alea()) donne N est très faible. ( en tout cas pas conforme à la probabilité théorique )
"j'ai testé 500 fois" C'est à mon avis pas suffisant pour avoir une erreur.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Patrick, j'ai continué dans le même délire.
Soit 10 colonnes de 1 000 000 cellules comportant la formule : =alea()
Recalcul 10 fois, soit 100 000 000 tests.
J'obtiens :
Nombre de 0 : 0
Nombre de 1 : 0
Min du tableau : 0.000000003597398823274
Max du tableau : 0.999999996813333000000
On peut donc en conclure que la fonction "alea" ne renvoie pas 0<=N <=1 mais 0<N<1.
Donc le max de Int(Rnd * UBound(tbl)) sera UBound(tbl)-1.

[Edit]
Dans MS doc :
=ALEA() Nombre aléatoire supérieur ou égal à 0 et inférieur à 1 (Lien )
Dans Excelformation.fr :
La fonction ALEA() permet d’obtenir un nombre décimal supérieur ou égal à zéro et strictement inférieur à 1. ( Lien )
Donc Alea() ne renvoie jamais 1.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Recalcul 10 fois, soit 100 000 000 tests.
Hélas ça ne démontre rien. Il suffit d'une fois même si le cas est quasiment improbable pour que cela soit faux.
Mais le problème n'est pas là. Pour trouver un nombre aléatoirement entre 1 et 1600 (par exemple ;)), on utilise bien souvent : en VBA 1 + Int(Rnd * 1600) ou bien en Excel =1+ENT(ALEA()*1600) ou encore =ALEA.ENTRE.BORNES(1;1600)
Et là, c'est une autre histoire concernant les doublons parmi les 1600 tirés au hasard.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD

patricktoulon

XLDnaute Barbatruc
re
alors vous allez pas le croire
j’étais vraiment intrigué par ce truc
car hier je testais sur w7 et je l'ai eu plusieurs fois le 1600+1
j'ai donc repris le pc portable W7 office 2013 et j'ai refait les 500 tests (2 FOIS!!!!)
résultat
1ère fois sur W7 et 2013 -->4 fois tombé dessus
2d fois sur W7 et 2013 -->1 fois tombé dessus

pareil sur W10 et 2013 2 fois 500 coups! --> jamais on tombe dessus
et qu'est ce vous dites de ça mes loulous
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Il semble qu'il aient changé leur algo à partir de 2010 ( Lien ) :
1674400974015.png

Mais ils n'ont pas changer leur déf de Alea. C'est ennuyeux.
Surtout si Windows s'en mêle !

Bon ceci dit, si en trois jours j'ai manipulé l'algorithme Fisher-Yates ainsi que l'algorithme Mersenne Twister, je ne me plains pas. 😂
 

patricktoulon

XLDnaute Barbatruc
re
bon en tout cas la version post#46 devient la plus rapide
de 0.016 je passe à 0.0154
et sans le rafraichissement je suis à 0.000
et toujours sur 40*40
autrement dit ceci
VB:
 For I = 1 To (UBound(tbl) * UBound(tbl, 2))
        l1 = 1 + Int(Rnd * UBound(tbl)): c1 = 1 + Int(Rnd * UBound(tbl, 2))
        l2 = 1 + Int(Rnd * UBound(tbl)): c2 = 1 + Int(Rnd * UBound(tbl, 2))
        X = tbl(l1, c1): tbl(l1, c1) = tbl(l2, c2): tbl(l2, c2) = X
    Next

est moins lourd que cela
VB:
 For P = UBound(TAl, 1) * UBound(TAl, 2) To 2 Step -1
      L2 = (P - 1) \ UBound(TAl, 2) + 1: C2 = (P - 1) Mod UBound(TAl, 2) + 1
      Q = Int(Rnd * P) + 1
      L1 = (Q - 1) \ UBound(TAl, 2) + 1: C1 = (Q - 1) Mod UBound(TAl, 2) + 1
      X = TAl(L1, C1): TAl(L1, C1) = TAl(L2, C2): TAl(L2, C2) = X
      Next P
 

Modeste geedee

XLDnaute Barbatruc
Bonsoir a tous , je cherche a faire un tableau de 40X40 cases
dans ces 1600 cases , je voudrez y mettre des chiffres compris entre 1 et 1600 , le tout aléatoirement
Jusqu'à maintenant j'arrive a rentré tout ces chiffres aléatoirement mais j'ai des doublons et il ne m'en faut pas
il faut que chaque cases est un chiffre diffèrent

Voila la formule que j'ai écrit dans A1 : =ALEA()*(1-1600)+1600

Je ne trouve as la solution , cela fait plusieurs jours que je cherche mais la , je sèche o_O

Quelqu'un peut il me dire ce qu'il ne va pas
Merci
Bonsour®
;) mapomme ... #11
sans macro sans doublons
sans commentaire...
;)
 

Pièces jointes

  • 1600 sans doublons sans macro.xlsx
    82.7 KB · Affichages: 7

Discussions similaires

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 688
dernier inscrit
Biquet78