Tirage au sort et pourcentage

Gunther

XLDnaute Nouveau
Bonsoir le forum,

Je n'arrive pas (et ne trouve pas) de solution afin de faire un tirage au sort à quatre Numéro.

En fait je voudrais qu'à l'aide d'une fonction ou d'une macro un résultat du genre 7.8.5.2 apparaisse.

Jusque là pas de problème... sauf que la où ça pêche...
C'est que je voudrais qu'il y ait plus de chance que un 1 sorte, et à l'inverse, que un 9 sorte plus rarement...

Du genre, le "1" a 20% de chance d'apparaître
tandis que le "9" n'a que 1% de chance d'apparaître.

Merci d'avance :)

A bientôt
 

JNP

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

Bonjour Gunther :),
Code:
=SI(ENT(ALEA()*10)=9;1;ENT(ALEA()*9,1))&"."&SI(ENT(ALEA()*10)=9;1;ENT(ALEA()*9,1))&"."&SI(ENT(ALEA()*10)=9;1;ENT(ALEA()*9,1))&"."&SI(ENT(ALEA()*10)=9;1;ENT(ALEA()*9,1))
semble donner satisfaction.
Voir en PJ la simulation sur 5000 valeurs.
Bonne soirée :cool:
 

Pièces jointes

  • Tirage.xls
    207 KB · Affichages: 177
  • Tirage.xls
    207 KB · Affichages: 157
  • Tirage.xls
    207 KB · Affichages: 157

CBernardT

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

Bonjour Gunther, JNP et le forum,

Un essai de tirage d'une combinaison à 4 chiffres selon le choix du pourcentage de sortie de certains chiffres.

Dans la colonne B, choisir le pourcentage de sortie de certains chiffres. Bien sûr la somme de ces pourcentages ne peut dépasser 100. Voir la somme affichée en B12 et les pourcentages finaux affichés en colonne D.

La macro lancée par le bouton "TIRAGE" réalise la combinaison à 4 chiffres et l'affiche en F3.
 

Pièces jointes

  • TirageChiffresPourcentChoisi.xls
    28.5 KB · Affichages: 174

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

Bonjour à tous
Sur la base du classeur de CBernardT (merci !), deux solutions par formule (feuilles Combinaisons (2) et Combinaisons (3)).​
ROGER2327
#4840


Dimanche 8 Décervelage 138 (Saint Bordue, Capitaine, ST)
16 Nivôse An CCXIX
2011-W01-3T15:00:01Z
 

Pièces jointes

  • Copie de TirageChiffresPourcentChoisi.xls
    34 KB · Affichages: 156

CHRIS1724

XLDnaute Nouveau
Re : Tirage au sort et pourcentage

Bonjour CBernardT,

Nous essayons désespéraiment de convertir la macro de (TirageChiffresPourcentChoisi.xls‎) sous OpenOffice pour Mac et aucun résultat satisfaisant. Malheuresement nous n'avons les compétence pour remédier au problème. Avez-vous une solution pour une convertir la macro.

Cordialement

Christel
 

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

Bonjour à tous.


Le classeur fonctionne avec LibreOffice sous Linux ou Windows 7.
Avec OpenOffice et Apple, je ne peux essayer.
En pièce jointe, le fichier .ods (converti en .zip pour être accepté).​


Bonne soirée.


ℝOGER2327
#7999


Dimanche 8 Phalle 142 (Sainte Léda, ajusteuse - fête Suprême Tierce)
1[SUP]er[/SUP] Fructidor An CCXXIII, 8,1172h - prune
2015-W34-2T19:28:52Z
 

Pièces jointes

  • TirageChiffresPourcentChoisi.zip
    18.1 KB · Affichages: 72

CHRIS1724

XLDnaute Nouveau
Re : Tirage au sort et pourcentage

Bonjour à tous,
La macro fonctionne maintenant parfaitement sous OpenOffice, mais un même chiffre peut apparaître plusieurs fois dans le même tirage*?
Je suis vraiment désolé d’être aussi nul et de ne pas pouvoir résoudre le problème.
Je vous remercie d’avance pour un conseil pour la modification de la formule.

Cordialement.

Chris
 

KenDev

XLDnaute Impliqué
Re : Tirage au sort et pourcentage

Bonjour à tous,

Après avoir vainement chercher la syntaxe d'une fonction renvoyant un tableau sous open office je poste quand même un code excel.
La fonction ne produit jamais de n° en doublons et est facilement adaptable en modifiant la 1ere ligne du module:

Exemple 1:
VB:
Const Ch$ = "17;15;13;11;9;7;5;3;1", Nb% = 4
La fonction renverra une combinaison aléatoire de 4 n° parmi 9 où le n° 1 aura un poid 17 fois plus important que le n° 9, le n° 2 15 fois etc...

Exemple 2:
VB:
Const Ch$ = "1;1;1;11;1;1;7;1;1;1;4", Nb% = 3
La fonction renverra une combinaison aléatoire de 3 n° parmi 11 où le n° 4 aura un poids 11 fois plus important que le n°1 (ou 2,3,5,6,8,9,10); le n° 7 11 fois et le n° 11 4 fois.

Exemple 3: Avec la ligne,
VB:
Const Ch$ = "80;70;60;50;40;30;20;10;0", Nb% = 4
j'obtiens sur 1000 combinaisons, 706 contenant le 1, 656 le 2 puis 621, 565, 527, 402, 335, 188 et 0.

Cordialement

KD

VB:
Const Ch$ = "80;70;60;50;40;30;20;10;0", Nb% = 4

Function CombinPond() As Variant
    Dim a$(), b%, i&, d&(), h#(), e#, f#, c#, j%
    Application.Volatile
    a = Split(Ch, ";"): b = UBound(a) + 1
    If Nb > b Then CombinPond = "Constantes Ch & Nb incompatibles": Exit Function
    For i = 1 To b
        If Not IsNumeric(a(i - 1)) Then CombinPond = "Ch contient élément(s) non numériques": Exit Function
    Next i
    d = CbTab(b, Nb): f = UBound(d): ReDim h(f)
    For i = 1 To f
        c = 1
        For j = 1 To Nb: c = c * a(d(i, j) - 1): Next j
        h(i) = h(i - 1) + c
    Next i
    Randomize: c = h(f) * Rnd
    For i = 1 To f
        If c < h(i) Then
            CombinPond = d(i, 1)
            For j = 2 To Nb: CombinPond = CombinPond & ";" & d(i, j): Next j
            Exit Function
        End If
    Next i
    CombinPond = "Echec, revoir chaine Ch"
End Function
'Tableau des combinaisons de b objets parmi a objets
Private Function CbTab(ByVal a&, ByVal b&) As Long()
    Dim n, t&(), c&, i&, j&, d As Boolean
    If a < 1 Or b < 1 Or b > a Then ReDim t(0): GoTo LineEnd
    n = CombinNb(a, b)
    If IsError(n) Then ReDim t(0): GoTo LineEnd
    On Error Resume Next
    ReDim t(1 To n, 1 To b)
    If TabDim(t) = 0 Then ReDim t(0): GoTo LineEnd
    On Error GoTo 0
    c = a - b
    For i = 1 To b: t(1, i) = i: Next i
    For i = 2 To n
        If b = 1 Then t(i, 1) = t(i - 1, 1) + 1 Else t(i, 1) = t(i - 1, 1) - (t(i - 1, 2) = c + 2)
        For j = 2 To b - 1
            If Not (t(i - 1, j + 1) = c + j + 1) Then t(i, j) = t(i - 1, j) Else d = t(i - 1, j) = c + j: t(i, j) = t(i + Not d, j + d) + 1
        Next j
        If t(i - 1, b) = a Then t(i, b) = t(i, b - 1) + 1 Else t(i, b) = t(i - 1, b) + 1
    Next i
LineEnd:
    CbTab = t
End Function
'Nb de combinaisons, b objets parmi a objets
Private Function CombinNb(ByVal a&, ByVal b&) As Variant
    Dim c&
    If a < 0 Or b < 0 Or b > a Then
        CombinNb = CVErr(xlErrNA)
    Else
        c = a - b
        If b < c Then c = b
        If c = 0 Then CombinNb = 1 Else CombinNb = MathFactoriel(a, c) / MathFactoriel(c)
    End If
End Function
'MathFactoriel, option préciser nb de termes
Private Function MathFactoriel(ByVal Nb&, Optional Iter& = 0) As Variant
    Dim i&, n&
    If Nb < 0 Or Iter < 0 Or Iter > Nb Then MathFactoriel = CVErr(xlErrNA): Exit Function
    If Iter = 0 Then Iter = Nb
    MathFactoriel = 1
    For i = 0 To Iter - 1
        MathFactoriel = MathFactoriel * (Nb - i)
        If MathFactoriel > 99999999999999# Then MathFactoriel = CVErr(xlErrNum): Exit Function
    Next i
End Function
'Nb dimensions d'un tableau (0 si non initialisé)
Private Function TabDim(Tb) As Byte
    Dim d&, p
    On Error GoTo Fin
    Do: d = d + 1: p = UBound(Tb, d): Loop
Fin:
    TabDim = d - 1
End Function
 

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

Re...


(...)
La macro fonctionne maintenant parfaitement sous OpenOffice, mais un même chiffre peut apparaître plusieurs fois dans le même tirage*?
(...)
Normal, le code n'a pas été conçu pour autre chose.
Voici une adaptation du code de CBernardT qui vous conviendra peut-être :​
Code:
Private Sub CommandButton1_Click()
' Procédure créée par CBernardT.
' Modifiée par ROGER2327 pour CHRIS1724.
Dim ListChiffres, Entiers, SomNombEnt As Integer, NbChiffres As Byte, Tableau(), Tirages()
Dim i As Integer, j As Integer, n As Integer, Combin As String, Dt As Boolean
' Tirage au sort des chiffres en nombre et en pourcentage
	With Sheets("Combinaisons")
' Nombre de chiffres à tirer au sort
		NbChiffres = Abs(Int(.Range("B14").Value))
		If NbChiffres Then
' Liste des chiffres à tirer au sort
			ListChiffres = .Range("A2:A11").Value
' Liste des multiples entiers par chiffres
			Entiers = .Range("C2:C11").Value
' Somme des multiples entiers
			SomNombEnt = .Range("C12").Value
' Tableau des chiffres selon leur nombre
			ReDim Tableau(SomNombEnt)
			For i = 1 To UBound(ListChiffres, 1): For j = 1 To Entiers(i, 1)
				n = n + 1: Tableau(n) = ListChiffres(i, 1)
			Next j: Next i
' Initialisation du générateur de nombres aléatoires
			Randomize
' Tirage des chiffres
			ReDim Tirages(1 To NbChiffres)
			For i = 1 To NbChiffres
				Do
					Tirages(i) = Tableau(Int(SomNombEnt * Rnd() + 1))
					Dt = False
					For j = 1 To i - 1: Dt = Dt Or (Tirages(j) = Tirages(i)): Next j
					n = n - 1
				Loop While Dt And n > 0
			Next i
			If Not Dt Then Combin = Join(Tirages, ".")
		End If
' Affichage de la combinaison des chiffres
		.Range("F3").Value = Combin
		.Range("A1").Select
	End With
End Sub


Bonne journée.


ℝOGER2327
#8000


Lundi 9 Phalle 142 (Saint Godemiché, économe - fête Suprême Quarte)
2 Fructidor An CCXXIII, 5,2227h - millet
2015-W34-3T12:32:04Z


P. s. : Bonjour KenDev.
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort et pourcentage

RE...


Re... problème avec OpenOffice ?
Si le classeur joint au message #8 fonctionne, je ne vois vraiment pas pourquoi la procédure modifiée pose un problème. Sa structure est semblable à celle de la structure initiale qui contenait aussi​
Code:
	With Sheets("Combinaisons")

Si vous n'avez pas fait d'autre modification que le remplacement de l'ancien code par le nouveau, je n'ai aucune solution à vous proposer. Désolé.​


ℝOGER2327
#8001


Lundi 9 Phalle 142 (Saint Godemiché, économe - fête Suprême Quarte)
2 Fructidor An CCXXIII, 6,0636h - millet
2015-W34-3T14:33:09Z
 

Statistiques des forums

Discussions
312 238
Messages
2 086 491
Membres
103 234
dernier inscrit
matteo75654548