Générer nombres aléatoires selon probabilité d'occurence

Bonjour,

De retour pour une nouvelle question...

J'aimerais dans plusieurs cellules générer un nombre aléatoire entre 0 et 7, mais chaque chiffre aurait une probabilité différente d'apparaitre :

0 = 25%

1 = 35%

2 = 20%

3 = 10%

4 = 5%

5 = 3%

6 = 1%

7 = 1%

J'ai trouvé comment générer des nombres aléatoires mais pas selon différentes probabilités d'occurence..

Pouvez-vous m'éclairer

Corentin

Bonjour,

En VBA ça se programme mais n'étant pas expert je te montre une solution sur Excel avec des fonctions.

Ça fonctionne un peu comme certains jeux de rôles, j'utilise un alea.entre.bornes qui génère un nombre entre 1 et 100 (Feuil1).

Après je fais une recherche de la valeur sortie dans un tableau renseigné dans "Conditions", j'ai répartis les valeurs avec des fourchettes différentes, afin de faire les différentes probabilités. Et tu as le résultat sur la Feuil2

Bonjour,

Salut Ausecour

Effectivement, il existe bien un code vba pour cela mais si on peut éviter le vba, il faut le faire ! Les fonction excel prévue à cette effet sont bien plus efficaces.

Cordialement

En effet,

Mais c'est posible de créer une fonction Excel faisant des nombres aléatoires avec des probabilités différentes, je pensais plutôt à ça en autre solution, mais ce n'est intéressant que si tu as un bon niveau en Excel et que tu dois souvent faire appel à ce type de fonction. Un code d'une foncton similaire existe peut-être sur internet

Bonjour à tous,

Si au lieu de nombres de 0 à 7 ça avait été des nombres de 1 à 6, j'aurais cru qu'c'était pour faire des dés pipés !

mais c'est p't'être pour tricher à un autre jeu ?

dhany

Bonjour, Salut à tous !

Une fonction personnalisée pour tirage de nombres de 0 à 7 selon probabilités prédéfinies...

Function ALEASELONPROBA()
    Dim proba, x%, i%
    Application.Volatile
    proba = Array(100, 99, 98, 95, 90, 80, 60, 25)
    Randomize
    x = Int(100 * Rnd + 1)
    i = WorksheetFunction.Match(x, proba, -1)
    ALEASELONPROBA = 8 - i
End Function

NB- On peut rendre la fonction plus générique en la dotant d'arguments pour lui passer une série de nombres à tirer avec les probabilités recherchées...

Cordialement.

411aleaselonproba.xlsm (16.20 Ko)

Bonsoir et merci pour toutes vos réponses !

@MFerrand j'ai choisi ta méthode qui semble correspondre le mieux à ce que je cherche. Ca fonctionne très bien sur le fichier que tu as joint à ton message mais lorsque je copie le code dans un module de mon propre tableur, un message d'erreur #NOM apparait quand je veux insérer la fonction =ALEASELONPROBA() dans une cellule.. Qu'est ce que je dois rajouter dans le tableur pour que ça fonctionne ?

Corentin

Bonsoir corentin,

Est-ce que ton fichier Excel a l'extension .xlsx ou .xlsm ? ça doit obligatoirement être un .xlsm pour pouvoir y mettre du code VBA.

Même si tu as copié le code VBA de MFerrand dans un module, il ne sera pas enregistré lors de la sauvegarde d'un fichier .xlsx !

dhany

C'est bien .xslm (j'ai pas mal d'autres macros dans le même fichier qui fonctionnent parfaitement)

Si tu peux joindre ton fichier .xlsm (sans données confidentielles), je veux bien essayer de voir ce qui ne va pas.

dhany

Bonjour, Salut à tous !

Tu as bien mis le code dans un Module Standard ?

Les autres modules ne sont pas publics, et la fonction n'y serait pas directement accessibles...

Cordialement.

Bonsoir,

J'ai rouvert le fichier et j'ai recopié le code dans un nouveau module et ça a fonctionné, j'ai pas l'impression d'avoir fait quelque chose différemment mais faut croire que si !

Merci beaucoup en tout cas

La fonction rendue plus générique :

Function ALEAPROBADEF(NbrProb As Range)
    Dim NbProb, Prob, TProb%, i%, x%
    Application.Volatile
    If NbrProb.Rows.Count = 2 Then
        NbProb = NbrProb.Value
    ElseIf NbrProb.Columns.Count = 2 Then
        NbProb = WorksheetFunction.Transpose(NbrProb.Value)
    Else
        ALEAPROBADEF = CVErr(xlErrNA): Exit Function
    End If
    NbProb(2, UBound(NbProb, 2)) = CInt(NbProb(2, UBound(NbProb, 2)))
    For i = UBound(NbProb, 2) - 1 To 1 Step -1
        NbProb(2, i) = NbProb(2, i + 1) + CInt(NbProb(2, i))
    Next i
    TProb = NbProb(2, 1)
    Prob = WorksheetFunction.Index(NbProb, 2, 0)
    Randomize
    x = Int(TProb * Rnd + 1)
    i = WorksheetFunction.Match(x, Prob, -1)
    ALEAPROBADEF = NbProb(1, i)
End Function

On lui passe en argument une plage sur 2 lignes ou 2 colonnes listant les nombres et leur probabilité.

Si la plage ne comporte pas 2 lignes ou 2 colonnes, la fonction renverra : #N/A.

Les nombres peuvent être remplacés par des lettres ou n'importe quelles autres indications.

Par contre les probabilités doivent être des nombres entiers (nb de chances affectées à chaque valeur d'être tirée sur le total des chances de toutes les valeurs). Les probabilités sont le cas échéant converties en entiers...

Cordialement.

201aleaselonproba.xlsm (20.55 Ko)
Rechercher des sujets similaires à "generer nombres aleatoires probabilite occurence"