Aléa entre quatre bornes en vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

13GIBE59

XLDnaute Accro
Bonjour le forum. 🙂

Je cherche la syntaxe vba pour réaliser un tirage aléatoire de nombres entiers situés entre quatre bornes.
Je m'explique :
Entre deux bornes, c'est facile : pour les bornes a et b (avec a > b) :

=Int ((a-b+1)*Rnd + b)

Je souhaite réaliser un tirage aléatoire de nombres entiers entre les bornes a et b et/ou les bornes c et d (avec bien sûr c > d et c # b+1, sinon ça serait trop simple...)

Est-ce possible ?
Merci d'avance.

Si je ne m'abuse, ça c'est un problème pour Roger2327, mon mathématicien préféré...😀
 
Re : Aléa entre quatre bornes en vba

Re

Et voila !
On se croit tranquille un samedi apres-midi ,content de soi parceque l'on a pondu une petite fonction
Et ROGER arrive (sans presser .....)
Alors la migraine commence a s'installer !
Parcequ'on ne peut pas s'en empecher: il faut tenter de comprendre
Et bien entendu on finit par implorer

ROGER voulez-vous bien nous expliquer S.V.P ?

Edit : Salut Lii (très bon le double tirage !!!)
 
Dernière édition:
Re : Aléa entre quatre bornes en vba

Bon, je reviens d'une chaîne cryptée pour voir un match de foot, et que vois-je ? Une réelle évolution ! 😛

Merci Lii pour ton code finalement facile à comprendre. 😉
Merci à Roger pour son approche mathématique comme je le pressentais en bas de mon premier post (en tout petit...)🙄

Cela dit, je rejoins pierrejean :
ROGER voulez-vous bien nous expliquer S.V.P ?
.
Et j'ajouterai, malgré ma (vieille) licence de sciences : au secours ! 😕
 
Re : Aléa entre quatre bornes en vba

Bonjour pierrejean, 13GIBE59
Comme souvent, la formule finale n'est pas claire. Mais si on l'écrit en décomposant, les choses deviennent simples.
Écrit comme suit, on voit mieux ce qui se passe.
Code:
[COLOR="DarkSlateGray"][B]Function codeSpec(a, b, c, d)
Dim i, r, x
   Application.Volatile
   i = (b + 1 - a) + (d + 1 - c) [COLOR="SeaGreen"]'somme des longueurs des intervalles "utiles".
'Attention aux classiques histoires de "piquets" et d'"intervalles" : d'où les + 1.[/COLOR]
   r = Int(i * Rnd) [COLOR="SeaGreen"]'un entier 0 <= r < i[/COLOR]
   x = a + r [COLOR="SeaGreen"]'un entier a <= x < a + i[/COLOR]
   [COLOR="SeaGreen"]'Si x > b il faut ajouter le "saut" de b à c : sa longueur est c - (b + 1)[/COLOR]
   If x > b Then x = x + c - (b + 1)
   codeSpec = x
End Function[/B][/COLOR]
La présentation que j'en ai donné précédemment s'obtient en regroupant les petits morceaux et en simplifiant autant que faire se peut. C'est amusant...
J'espère être plus clair. Si ce n'est pas le cas, vous ne vexerez pas en me le disant... A bientôt.​
ROGER2327
#2066
 
Re : Aléa entre quatre bornes en vba

Suite...
Bien entendu, on peut étendre à trois plages.
Le code suivant traite une à trois plages :
Code:
[COLOR="DarkSlateGray"][B]Function codeSpec3(a, b, Optional c, Optional d, Optional e, Optional f)
Dim i, r, x
   Application.Volatile
   [COLOR="SeaGreen"]'Contrôle de l'existence des trois plages[/COLOR]
   If VarType(e) = vbError Or VarType(f) = vbError Then e = c: f = d
   If VarType(c) = vbError Or VarType(d) = vbError Then c = a: d = b: e = a: f = b
   '
   i = (b + 1 - a) + (d + 1 - c) + (f + 1 - e) [COLOR="SeaGreen"]'somme des longueurs des intervalles utiles[/COLOR]
   r = Int(i * Rnd) [COLOR="SeaGreen"]'un entier 0 <= r < i[/COLOR]
   x = a + r [COLOR="SeaGreen"]'un entier a <= x < a + i[/COLOR]
  [COLOR="SeaGreen"] 'Si x > b il faut ajouter le "saut" de b à c : sa longueur est c - (b + 1)[/COLOR]
   If x > b Then x = x + c - (b + 1)
   [COLOR="SeaGreen"]'Si x > d il faut ajouter le "saut" de d à e : sa longueur est e - (d + 1)[/COLOR]
   If x > d Then x = x + e - (d + 1)
   codeSpec3 = x
End Function[/B][/COLOR]
On suppose évidemment que a <= b < c <= d < e <= f.​
ROGER2327
#2067
 
Re : Aléa entre quatre bornes en vba

Suite...
Une fois condensé, tout ça devient moins clair, pour ne pas dire obscur :
Code:
[B][COLOR="SeaGreen"]Function codeSpec_3(a, b, Optional c, Optional d, Optional e, Optional f)
   Application.Volatile
   If VarType(e) = vbError Or VarType(f) = vbError Then e = c: f = d
   If VarType(c) = vbError Or VarType(d) = vbError Then c = a: d = b: e = a: f = b
   codeSpec_3 = a + Int((3 + (a = c) + (a = e) + b - a + d - c + f - e) * Rnd) _
      - (c - b - 1) * ((a + Int((3 + (a = c) + (a = e) + b - a + d - c + f - e) * Rnd(0))) > b) _
      - (e - d - 1) * ((a + Int((3 + (a = c) + (a = e) + b - a + d - c + f - e) * Rnd(0)) _
      - (c - b - 1) * ((a + Int((3 + (a = c) + (a = e) + b - a + d - c + f - e) * Rnd(0))) > b)) > d)
End Function[/COLOR][/B]
Comme je le disais plus haut, c'est juste pour le plaisir... (Le samedi, on peut s'amuser.)
Compte tenu de la répétition des calculs qu'une telle forme implique, ce n'est certainement pas la bonne solution (Bonjour la maintenance !). L'utilisation de variables intermédiaires est plus clair, et, vraisemblablement, plus efficace.​
Bonne soirée.
ROGER2327
#2068
 
Re : Aléa entre quatre bornes en vba

Bonsoir Roger,

Votre méthode est parfaite.

Elle revient à éliminer les distances entre les plages, et tout se passe donc comme s'il n'y en avait qu'une seule.

Ainsi tous les nombres de ces plages ont la même probabilité d'apparaître dans le tirage aléatoire.

Ce n'était pas du tout le cas dans la solution que j'ai présentée, ma copie ne vaut donc pas grand'chose 😱

A+
 
Re : Aléa entre quatre bornes en vba

Re...
(...)
Votre méthode (...) revient à éliminer les distances entre les plages, et tout se passe donc comme s'il n'y en avait qu'une seule.

Ainsi tous les nombres de ces plages ont la même probabilité d'apparaître dans le tirage aléatoire.
(...)
Bonsoir job75, c'était une condition implicite que je m'étais imposée. S'il s'agit d'engendrer des mots de passe ou autres codes plus ou moins secrets, c'est la moindre des choses.
Merci de l'avoir remarqué.
Cordialement,
ROGER2327
#2070
 
Re : Aléa entre quatre bornes en vba

Et suite encore...
Une autre formulation qui doit également assurer l'équiprobabilité des tirages.
Code:
[COLOR="DarkSlateGray"][B]Function codSpec(a, b, c, d)
   Application.Volatile
   codSpec = IIf(Rnd < (b + 1 - a) / (2 + b - a + d - c), _
      a + Int((b + 1 - a) * Rnd(0)), c + Int((d + 1 - c) * Rnd(0)))
End Function[/B][/COLOR]
(On suppose toujours que a <= b < c <= d.)​
ROGER2327
#2075
 
Re : Aléa entre quatre bornes en vba

Bonsoir à tous et à toutes

13GIBE59 à dit:
je veux une valeur aléatoire comprise entre les valeurs 33 et 47 et 58 et 63
Une autre solution (à adapter ...)
Code:
    x = Int(([B][COLOR=blue]53[/COLOR][/B] - [B][COLOR=red]33[/COLOR][/B] + 1) * Rnd + [B][COLOR=red]33[/COLOR][/B])   [B][COLOR=green]' = Alea.Entre.Borne([COLOR=red]3[/COLOR][COLOR=red]3[/COLOR];53[/COLOR][/B])
    If x > [COLOR=black]47[/COLOR] Then x = x + 10           [B][COLOR=green]' 48 + 10 = 58 (et bien sur : 48 > 47)[/COLOR][/B]
A plus
 
Dernière édition:
Re : Aléa entre quatre bornes en vba

Re...
Bonsoir à tous et à toutes


Une autre solution (à adapter ...)
Code:
    x = Int((53 - 47 + 1) * Rnd + 47)   [B][COLOR=green]' = Alea.Entre.Borne(47;53[/COLOR][/B])
    If x > 47 Then x = x + 10           [B][COLOR=green]' 48 + 10 = 58 (et bien sur : 48 > 47)[/COLOR][/B]
A plus
Oui, mais attention aux paramètres !
Code:
[COLOR="DarkSlateGray"][B]   x = Int([COLOR="Red"]21[/COLOR] * Rnd + [COLOR="Red"]33[/COLOR])   [B][COLOR=green]' = Alea.Entre.Borne([COLOR="Red"]33[/COLOR];53[/COLOR][/B])
   If x > 47 Then x = x + 10[/B][/COLOR]
(C'est la même méthode qui est employée dans les propositions du message #14, à ceci près qu'ici chaque paramètre a, b, c et d est remplacé par sa valeur numérique.)​
ROGER2327
#2077
 
Dernière édition:
Re : Aléa entre quatre bornes en vba

Bonjour le fil, le forum,

(...) tous les nombres de ces plages ont la même probabilité d'apparaître dans le tirage aléatoire.

Ce n'était pas du tout le cas dans la solution que j'ai présentée (....)

J'ai dû écrire ça sous le coup de l'émotion devant la beauté de la solution de Roger 😕

En fait dans ma solution tous les nombres ont bien la même probabilité d'apparaître puisque quand un nombre entre les 2 plages est tiré il y a nouveau tirage...

Simplement ça prend du temps si les plages sont très éloignées 😱

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
661
Réponses
34
Affichages
2 K
E
Réponses
2
Affichages
1 K
Edouard :)
E
Retour