Générer des nombres aléatoirement en proportion

Signaler
Messages postés
2
Date d'inscription
vendredi 8 juin 2012
Statut
Membre
Dernière intervention
8 juin 2012
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour, j'aimerais savoir s'il est possible de générer des nombres aléatoirement mais en proportion.

Par exemple, pouvoir remplir une feuille avec 10% de chiffres 1, 30% de chiffres 0, 40% de chiffres 2 et 20% de chiffres 3.

Je vous remercie.

20 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,
Tu veux donc savoir si c'est possible ! Telle est donc ta question.
La réponse est donc : oui.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
2
Date d'inscription
vendredi 8 juin 2012
Statut
Membre
Dernière intervention
8 juin 2012

Ok, tu peux donc certainement me dire comment je dois faire pour effectuer la proportion ;) Je sais générer nombres mais pas en proportion
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ah !
Exactement de la même manière que celle dont tu t'y prendrais avec des pois rouges, des pois verts, des pois bleus et des pois jaunes mis dans un sac et que tu voudrais tirer au hasard avec 10 % de chances pour les rouges, 30 % pour des verts, 40 % pour les bleus et 20 % pour les jaunes ===>> tu mettrrais dans ton sac 100 pois, dont 10 rouges, 30 verts, 40 bleus et 20 jaunes ===>> et tu y fourerais ta main pour en sortir un au hasard !
Sacré "algorithme", que celui-là ! Tiens donc !
Même pas besoin d'être un développeur pour une telle "solution" !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Bonjour cedric n° 06110

Ça devrait à peu près donner ça :

Option Explicit On
Public Class Form1

  Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    ' 10% de chiffres 1
    ' 30% de chiffres 0
    ' 40% de chiffres 2 
    ' 20% de chiffres 3
    Dim hasard As Integer = 0
    Dim i0 As Byte = 0
    Dim i1 As Byte = 0
    Dim i2 As Byte = 0
    Dim i3 As Byte = 0
    Dim range As String = ""
    Do While Len(range) <> 100
      Randomize()
      hasard = Int((4 - 1 + 1) * Rnd() + 1) - 1 ' car je ne sais pas si on peut tirer 0 avec ça
      Select Case hasard
        Case 0
          If i0 > 30 Then GoTo suite
          i0 = i0 + 1
        Case 1
          If i1 > 10 Then GoTo suite
          i1 = i1 + 1
        Case 2
          If i2 > 40 Then GoTo suite
          i2 = i2 + 1
        Case 3
          If i3 > 20 Then GoTo suite
          i3 = i3 + 1
      End Select
      range = range & hasard
suite:
    Loop
    MsgBox(range)
    End
  End Sub

End Class


Cordialement, Joe.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Essayons de ne pas confondre les choses :
- les probabilités de tirage une une chose
Ce n'est pas parce qu'un nombre a par exemple 20 % de chances d'être tiré qu'il sera nécessairement tiré 20 fois sur 100 tirages. Il pourrait tout aussi bien n'être jamais tiré, tout en ayant 20 % de chances de l'être.
- forcer un tirage à un résultat qui respecterait des proportions n'a plus rien d'aléatoire
Et analysons maintenant le sens de cette phrase, telle que rédigée :
Par exemple, pouvoir remplir une feuille avec 10% de chiffres 1, 30% de chiffres 0, 40% de chiffres 2 et 20% de chiffres 3.

Ben ... cela veut dire que le résultat à constater est forcé !
Même plus besoin d'un tirage aléatoire, pour y parvenir ! Une simple boucle for ... to ... next fera l'affaire !
A moins que le demandeur n'ait voulu dire : "feuille ainsi remplie", mais dans un ordre aléatoire.
Si tel était le cas : après avoir rempli dans l'ordre de la boucle ===>> mélanger (schuffle) les résultats !

Voilà ! se pose simplement la question de savoir ce que veut faire le demandeur (probabilités respectées ou forçage du résultat ?)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Exemple de machine aléatoire avec pourcentage de "réussite".
Une machine à sous de type "jackpot", déclarée (et de conception vérifiée) pour offrir 1% de propabilité d'obtention du "jackpot".
Elle ne saurait (illégal) être assortie d'un mécanisme parallèle tel que si le jackpot a été obtenu au cours des toutes premières tentatives, il ne saurait plus l'être avant la 101ème tentative suivante !
Aucun joueur ne serait par ailleurs (et inversement) en droit d'exiger que ce jackpot "sorte" s'il joue 100 fois !
Voilà voilà (pour illustrer la nécessité d'être précis sur le but à atteindre).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Bonjour Jacques,

J'ai fait ça pour m'amuser, ce n'est peut être pas optimisé d'ailleurs, il y a plusieurs façon de coder ici, peu importe en pratique...

En plus l'auteur ne voyait manifestement pas comment faire, se demandant même si c'était faisable. Ça veut dire qu'il n'avait pas au minimum le petit savoir nécessaire à cette manipulation de code, que je mettrais à un niveau 2,5 / 5, car il y a quand même (outre l'aspect mathématique) à savoir utiliser les variables, à cadrer la génération d'un nombre pseudo-aléatoire, une boucle, des tests, un débranchement ou une incrémentation... Et à savoir qu'il faut mettre tout ça dans un ordre déterminé.
Je ne croi pas que ce soit du niveau débutant, qui peut être censé connaîtr les directives au mieux, mais ne saura pas en imbriquer plusieurs.

Ah ben voui, à mon sens la question ne vaut que quand aux proportions selon le nombre et à leur ordre de sortie (pseudo-hasardeux), sinon ce n'est plus du tirage...

Voici un exemple du résultat :
3213223322102012021132213302000112001213120023333222233332023023023233222020020002200002200002200202

Cordialement, Joe.
Messages postés
34
Date d'inscription
jeudi 7 juin 2012
Statut
Membre
Dernière intervention
14 juin 2012
1
bonjour,
moi je vous renverrai vers l'excellent prog de nix "générer un mot de passe sécurisé" qui répond parfaitement à cette problématique.
Monsieur ucfoutu, essayez de moins polémiquer cette façon de faire peut nuire à cet excellent site

Lydie
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Jack, suite...

Ça me rappelle mon logiciel de loto, où à l'époque j'avais été pris a partie et traité d'escroc en somme, par un visiteur du forum vbA de Microsoft (ancien forum).

En effet, j'indiquais que si on tenait compte de la mécanique statistico-mathématique on pouvait augmenter ses chances de gains...

Lui, traduisait sans doute ça dans son esprit comme "gagner", et sachant que c'était impossible de le calculer il se croyait fondé à s'insurger sans comprendre en fait...

J'avais beau expliquer le postulat que chaque boule ayant la même chance de gagner, à un instant T touts les boules seraient de même nombre de tirage (c'est d'ailleurs ce que j'ai constaté sur l'ancien Loto où l'écart moyen n'était pas très creusé sur 30 ans).
Mais ceci ne dit pas quand ça va se produire, car ceci se peut entre maintenant et l'infini, alors on ne peut même par faire une moyenne (maintenant - infini) / 2, ce qui éclaire peu...

Par contre, le postulat que chaque boule a la même chance implique ipso facto que les boules en retard vont sortir d'avantage que celles qui sont en avance (dans l'absolu), puisqu'il n'y a qu'un sens, c'est leur seule chance de tendre à arriver à égalité des premières.

Que donc, si on jouait tout simplement les boules en retard, la loi statistique ferait qu'on en trouverait un peu plus que si on jouait les boules en tête (ce qui, comme sus-cité se démontre sur 30 ans, mais bien avant aussi).

Ainsi, à la longue, entre un échantillon représentatif qui jouerait les boules perdantes, et un autre qui jouerait de façon différente (fixe, hasard), et bien l'échantillon qui jouerait les boules en retard aurait sensiblement davantage de gains.
On peut facilement constater ce mécanisme sur la boule unique de la chance (n°), numéro qui, quand il est le plus bas, s'il est joué provoque une meilleure réussite car ce numéro remonte les autres sur trois mois par exemple, et ainsi de suite.

On a donc bien sur cette logique statistique une chance de gagner davantage de fois, mais pas les 5 numéros, non, juste 1 numéro généralement.

Et in fine, tout démontre de facton que celui qui a l'état naturel aurait 4 boules, en appliquant cette méthode aurait davantage de chance de trouver la 5emme et le gros lot

Mais ça ne dit en aucun cas que la méthode permet de gagner, elle permet d'améliorer un peu les chances de gains...

Eh bien la personne n'a jamais voulu en démordre, pour elle c'était le hasard, et pour elle le hasard ne se calculait pas, même dans l'ébsolu, autrement dit la mathématique statistique est une escroquerie...

Ce qui est faux, on peut calculer les probabilité du hasard si tous les composants sont connus ou déduit, mais ce n'est en aucun cas obligatoirement intuiti personae.

Bref, d'avoir évoqué le hasard me rappelait ce passage amusant où certaines personnes se refusent à admettre des évidences au nom d'une sorte de croyance au Dieu Hasard. Ceci revenant, non pas à voir, mais à pouvoir en probabilité calculer l'avenir, en probabilité seulement...

Hum, cordialement, Joe.
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Bonjour debutemps,

Un mot de passe sécurisé se fait de la même façon, on tire au hasard, puis avec un second hasard on met en chiffre ou en lettre, éventuellemnet avec une routine qui élimine certaines configurations, ça n'a réellement rien d'intéressant en programmation, enfin, pas grand chose.

Je ne crois pas a contrario qu'il y ait de la polémique, c'est simplement deux vues différentes :
L'une sur la méthode tu cherche = tu trouve ou tu change de métier.
Et l'autre sur la méthode scolaire de de l'exemple commenté et démontré.

L'une est une méthode pour QI avec plus de I, l'autre est une méthode avec les Q et les I équilibrés...

Tout le problème est le même que celui des tests de Qi, y en a qui ont plus de Q que de I...
Pour résoudre un problème de pignons et ou de rouleaux en friction, il faut encore avoir déjà vu la chose, savoir qu'elle tourne sur son axe centré, savoir que c'est en insertion ou en friction entre les éléments rotatif et ce que provoque cet effet.
Or celui qui n'a jamais vu tout ça, même avec peu de Q et moult I ne saura répondre qu'au hasard, diminuant ses chances statistiquement de 50%...
CQFD...

Ce qui n'est pas sans rappeler jadis les tests des trois jours de l'armée, où au pire en épondant n'importe quoi, on a le nombre de points moyens équivalant à 1 (bonne réponse) / nombre de réponses possible à la question...

Cordialement, Joe.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
A debutemps, qui a écrit ceci :
moi je vous renverrai vers l'excellent prog de nix "générer un mot de passe sécurisé" qui répond parfaitement à cette problématique.
Monsieur ucfoutu, essayez de moins polémiquer cette façon de faire peut nuire à cet excellent site

=>>
Sans commentaires et complètement ... à côté de la plaque !
Aucune polémique : juste deux méthodes exposées (l'une, dans mon premier message, pour probabilités), l'autre, pour "forcer".
Et une demande de précisions sur le but.
Ton message, debutemps, est pour le moins étonnant.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
34
Date d'inscription
jeudi 7 juin 2012
Statut
Membre
Dernière intervention
14 juin 2012
1
Bonjour Joe,
il te manque une donnée essentielle, c'est qu' ucfoutu détient la science infuse. Je comprends très bien ta démarche


Lydie
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
"Science infuse" de la part de quelqu'un qui n'a posté aucune solution valable, on se gausse !!

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Bonjour Lydie,

C'est vrai que ta participation est légère pour profaner une réponse, d'autant que tu ne proposes pas mieux, en fait, tu ne donnes aucune réponse, n'est-ce pas ceci justement la polémique, ah ?

Jacques (ucFoutu), j'ai pu m'en rendre compte, est très compétent en programmation, il est aussi serviable et a de l'humour, tout en étant assidu aux réponses. C'est un des deux piliers dans ce forum quant aux réponses, et peut être d'autres codes sur le site.
Heureusement que Jacques est là, bien que certes, je ne partage pas ses méthodes d'apprentissage, ce dernier est toujours disponible.

Nonobstant, il est possible qu'un message que l'on veut humoristique ne passe pas toujours de la même façon par écrit.
Il m'est moi même arrivé de tancer une personne sur un forum (pas ici), et de me faire rabrouer par les autres parce que par écrit j'avais mal exprimé mon humour ; ou les interlocuteurs dans le QI manquaient de I... L'humour est indéniablement une preuve de I, mais jamais de Q, dans le QI évidemment ; d'ailleurs les enfants n'en ont pas avant une dizaine d'année, et les animaux jamais... Chez l'humain à 80 commence la débilité légère (l'idiot du village), à 40 c'est la débilité profonde en psychiatrie, or nos animaux de compagnie, comme le chien et le chat n'ont qu'un QI de 40, et pourtant ils ont un comportement normal par rapport à un humain qui a le même QI.
Tout est relatif, l'humour dépend de celui qui l'écrit mai aussi de celle qui le lit?

Et particulièrement dans ce forum, car il a une propension à attirer les "débutants", les messages sont souvent quasi-incompréhensibles, incomplets, illogiques, mal exprimés et pleins de fautes, ce qui s'excuse face au jeune âge de certains ou envers des étrangers, mais est moins excusable à l'encontre de personne françaises apprenant la programmation à l'université. Alors au bout d'un certain nombre de tels messages il n'est pas impossible de s'exaspérer en prenant un ton narquois?
Ça vient en sus du fait qu'on ne sait guère qui est le questionneur, pour cela il faudrait afficher l'âge, le niveau d'études et la nationalité, aucun forum ne le fait en entier. De facto en pense dialoguer au moins avec un jeune adulte français, or si ce n'est pas le cas, évidemment, on trouve que la personne est négligée, et on répond en conséquence par réflexe, or parfois c'est une erreur involontaire. Il m'est arrivé par exemple dans le forum du zéro (0) de répondre sèchement à une question en dessous du niveau d'un chat. Heureusement l'auteur a rétorqué qu'il n'avait que treize ans, évidemment, j'ai reconsidéré ma réponse, lui accordant un large bénéfice de minorité, je m'en souviens encore, une erreur sur la personne en somme?

Bon, après ces considérations de réponse en programmation, tu pourrais essayer d'améliorer le code de ma réponse par exemple, non ?

Cordialement, Joe.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Merci, MarcPL
Moi, je ne me gausse même plus, mais pleure devant la maladie de certain(e)
Je crois que l'on va tenter de guider le demandeur et de l'éclairer du même coup.
Etape 1 : comment "remplir le sac" selon la règle définie, à savoir :
avec 10% de chiffres 1, 30% de chiffres 0, 40% de chiffres 2 et 20% de chiffres 3

a) en choisissant son "sac" : je choisi ici une matrice
 Dim tablo(100)
  For i = 1 To 100
    Select Case i
      Case Is <9: a 1
      Case Is <19: a 3
      Case Is <29: a 0
      Case Else: a = 2
    End Select
  Next

b) Qu'en faire ensuite ?
- hypothèse 1 : y tirer aléatoirement : on tire aléatoirement un index de 0 à 100 et on lit tout simplement l'index correspondant dans tablo
- hypothèse 2 : simplement "remplir le sac" : déjà fait
- hypothèse 3 : mélanger (shuffling) la matrice tablo (pour en modifier aléaloirement l'ordre :

nb = UBound(tablo)
 For i = 0 To nb \ 2
  ou = Int(((nb - i) * Rnd))
  temp = tablo(ou)
  tablo(ou) = tablo(nb - i)
  tablo(nb - i) = temp
 Next

Voila notre matrice ainsi complètement "touillée" de manière aléatoire

Voilà ! C'est tout bête !
A partir de là, à lui de choisir, puis exploiter comme il l'entend, en fonction de ce qu'il veut (et qui n'est pas encore réellement défini).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
34
Date d'inscription
jeudi 7 juin 2012
Statut
Membre
Dernière intervention
14 juin 2012
1
compétent compétent
je cite:
[i] Dim tablo(100)
For i = 1 To 100/i
pour quelqu'un qui ne veut pas induire les débutemps en erreur.

le tableau commence à 0 sinon on rate un élément
mossieur le compétent

Lydie
Messages postés
14815
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2021
156
Bonjour,

Je vois que le sujet a dérivé un peu.

Debutemps, je ne trouve pas la source dont tu parles :
moi je vous renverrai vers l'excellent prog de nix "générer un mot de passe sécurisé" qui répond parfaitement à cette problématique.

Peux-tu poster le lien vers la source en question ?

Concernant les 2ième message de Debutemps :
Bonjour Joe,
il te manque une donnée essentielle, c'est qu' ucfoutu détient la science infuse. Je comprends très bien ta démarche


Je ne peut le supprimer sans effacer la prose de Joe (pour garder la cohérence du sujet) qui est, je trouve, très bien commentée et pourrait même être conservée si d'autres cas comme celui-ci se présentait à l'avenir.

Concernant l'index 0, cela n'est imposé qu'en .NET, en VB6, il est possible de changer la limite inférieure d'un tableau, par exemple, ces tableaux sont corrects :
Dim UnTab(0 To 50)
Dim UnTab(-10 To 50)
Dim UnTab(10 To 50)
Dim UnTab(1 To 50)
Dim UnTab(-100 To -50)


De plus, l'option Option Base peut être utilisée pour faire démarrer un tableau à l'index 0 ou 1 par défaut.
Le code proposé par Ucfoutu ne me gène donc pas, car c'est une pratique courante dans VB6 (Les collections commencent à 1 alors que les ListBox à 0).

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Ah, un concours de code Je vais perdre, je suis moins bon, alors :


Dim h, p As Integer, i(3) As Byte, t(99) As Integer
    t(99) = 4
    Do While t(99) > 3
      Randomize()
      h = Int((4 - 1 + 1) * Rnd() + 1) - 1
      If h 0 And i(h) 30 Then h = 4
      If h 1 And i(1) 10 Then h = 4
      If h 2 And i(2) 40 Then h = 4
      If h 3 And i(3) 20 Then h = 4
      If h < 4 Then
        i(h) = i(h) + 1
        t(p) = h
        p = p + 1
      End If
    Loop



Cordialement, Joe.
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
6
Lydie, Suite,

Je confirme ce qu'écrit Nicols (NHenry) :

Notamment parce qu'en VB lato sensu on a une relative confusion, par exemple un tableau commence à 0 mais un objet à 1.

Il est souvent admis pour le commun des mortels en mathématique (sans que ce soit absolu), que le 0 est une valeur neutre, donc plus logique de commencer à 1, et aussi pour être en harmonie avec l'indice des objets.

La déclaration t(x), x s'ignifie de 0 jusqu'à x implicitement, de facto le meilleur exemple est celui de Nicolas dans lequel il faudrait écrire :

Dim t(1 To 100) as integer


Pour ma part, bien que j'ai fait le contraire dans mon second exemple), il est mieux d'écrire en commençant à 1, ça évite les embrouilles, car c'est prequ'instinctif, on laisse le séro de côté...

Toutefois Lydie, tu sembles savoir plein de choses, ne voudrais-tu pas améliorer les derniers codes déposés afin de faire mieux au bénéfice du questionneur (qui fait la sieste), je voudrais bien voir ?

Cordialement, Joe
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Je reviens vers cedric, dont je vois qu'il a écrit dans son tout premier message :
Par exemple, pouvoir remplir une feuille avec 10% de chiffres 1, 30% de chiffres 0, 40% de chiffres 2 et 20% de chiffres 3.

Ce qui me donne à penser qu'il développe finalement sous VBA/Excel et qu'il veut remplir une feuille de Excel, de la manière indiquée.
Reprenons donc, cedric, ton exemple de répartition :
Le code ci-dessous, écrit à la va-vite va remplir ta feuille de 10000 lignes dans les proportions souhaitées. Je lui ai ajouté de quoi "laisser en l'état" ou "mélanger le tout".
Tu remarqueras que je passe par un tableau dynamique à deux dimensions (pour pouvoir en injecter les valeurs après travail sur le tableau) :
Sur la feuille de ton choix (qui serra donc la feuille active) : un bouton de commande Commanbutton1 et ce code :
Private Sub CommandButton1_Click()
  Cells.Clear
  ReDim tablo(0, 0) As Long
  Dim a As Double, x As Long, i As Long, nb As Long
  x = 10000
  ReDim tablo(1 To x, 1 To 1) As Long
  a = 1
  For i = 1 To x
    Select Case i
      Case Is 1001: a 3
      Case Is 3001: a 0
      Case Is 6001: a 2
    End Select
   tablo(i, 1) = a
  Next
  If MsgBox("voulez-vous les mélanger ?", vbYesNo) = vbYes Then
    nb = UBound(tablo)
    For i = 1 To nb - 1
      ou = Int(((nb - i + 1) * Rnd) + 1)
      temp = tablo(ou, 1)
      tablo(ou, 1) = tablo(nb - i, 1)
      tablo(nb - i, 1) = temp
   Next
  End If
  Range("A1:A" & x).Value = tablo
  
  '--------------tout ce qui suit n'est là que pour que tu constates le résultat et n"'a rien à voir avec le code
  For i = 1 To 7
    Columns(i).ColumnWidth = 20
  Next
  Range("C3:G3").Interior.Color = RGB(255, 200, 200)
  Range("C1:G1").Interior.Color = RGB(0, 250, 200)
  Range("C2:G2").Font.Color = RGB(255, 0, 0)
  Range("B1").Value = "Voulu"
  Range("B2").Value = "nombres générés"
  Range("B3").Value = "Pourcentages"
  Range("C1").Value = "pour les 1 (10%)"
  Range("D1").Value = "pour les 2 (40%)"
  Range("E1").Value = "pour les 3 (20%)"
  Range("F1").Value = "pour les 0 (30%)"
  Range("G1").Value = "total"
  Range("C2").Formula = "=COUNTIF(A:A,1)"
  Range("D2").Formula = "=COUNTIF(A:A,2)"
  Range("E2").Formula = "=COUNTIF(A:A,3)"
  Range("F2").Formula = "=COUNTIF(A:A,0)"
   Range("G2").Formula = "=SUM(C2:F2)"
  Range("C3").Formula = "=(C2/G2)*100 & "" %"""
  Range("D3").Formula = "=(D2/G2)*100 & "" %"""
  Range("E3").Formula = "=(E2/G2)*100 & "" %"""
  Range("F3").Formula = "=(F2/G2)*100 & "" %"""
End Sub


Le code "utile est toute la partie supérieure. La partie inférieure n'est là que pour te permettre d'en contrôler les résultats et peut donc êtrre supprimée.
Voilà le principe. Il est celui que j'exposais plus haut.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ