Générer valeurs aléatoires entre bornes dont la somme déterminée
Résolu/Fermé
Izy3834
Messages postés
8
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
20 mars 2015
-
17 janv. 2015 à 16:04
ccm81 Messages postés 10902 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 18 novembre 2024 - 18 janv. 2015 à 15:34
ccm81 Messages postés 10902 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 18 novembre 2024 - 18 janv. 2015 à 15:34
A voir également:
- Vba nombre aléatoire entre bornes
- Nombre facile - Télécharger - Outils professionnels
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Find vba - Astuces et Solutions
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Le nombre de tentatives de déverrouillage incorrectes est trop élevé samsung ✓ - Forum Samsung
9 réponses
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
Modifié par ccm81 le 18/01/2015 à 14:43
Modifié par ccm81 le 18/01/2015 à 14:43
Une procédure plus rapide à l'exécution qui fait tout dans un tableau en mémoire avant de le transposer dans la feuille
Cdlmnt
Const plage = "A1:A20"
Const total = 10000
Const mini = 100
Const maxi = 1000
Public Sub tirageR()
Dim n As Long, tot As Long, a As Long, k As Long, d As Long, T
If Range(plage).Columns.Count > 1 Then Exit Sub
n = Range(plage).Cells.Count
ReDim T(1 To n)
tot = 0
For k = 1 To n
a = mini + Int((maxi - mini + 1) * Rnd)
tot = tot + a
T(k) = a
Next k
If tot < total Then
d = total - tot
For k = 1 To d
a = 1 + Int(n * Rnd)
If T(a) < maxi Then
T(a) = T(a) + 1
Else
k = k - 1
End If
Next k
ElseIf tot > total Then
d = tot - total
For k = 1 To d
a = 1 + Int(n * Rnd)
If T(a) > mini Then
T(a) = T(a) - 1
Else
k = k - 1
End If
Next k
End If
Range(plage) = Application.Transpose(T)
End Sub
Cdlmnt
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
17 janv. 2015 à 17:06
17 janv. 2015 à 17:06
Bonjour,
Dim c As Range For Each c In Range("A1:B50")'a adapter à la plage c.Value = Int(Rnd * 99) + c Next c
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
17 janv. 2015 à 17:09
17 janv. 2015 à 17:09
Autant pour moi, c'est comme cela:
Dim c As Range For Each c In Range("A1:B50") c.Value = Int(Rnd * 99) Next c
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
Modifié par ccm81 le 17/01/2015 à 17:18
Modifié par ccm81 le 17/01/2015 à 17:18
Bonjour
Peut être ceci
https://www.cjoint.com/?3ArrBhDINWx
Ctrl+t pour lancer la macro
Alt-F11 pour acceder au code (dans Module 1)
Cdlmnt
Peut être ceci
https://www.cjoint.com/?3ArrBhDINWx
Ctrl+t pour lancer la macro
Alt-F11 pour acceder au code (dans Module 1)
Cdlmnt
Izy3834
Messages postés
8
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
20 mars 2015
17 janv. 2015 à 17:23
17 janv. 2015 à 17:23
merci beaucoup de votre aide.
Cependant quelque chose m'échappe dans le script, comment renseigne-t-on l'intervalle/les bornes??
Cependant quelque chose m'échappe dans le script, comment renseigne-t-on l'intervalle/les bornes??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Izy3834
Messages postés
8
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
20 mars 2015
17 janv. 2015 à 17:21
17 janv. 2015 à 17:21
merci à tous pour vos réponses!
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
Modifié par ccm81 le 17/01/2015 à 18:24
Modifié par ccm81 le 17/01/2015 à 18:24
maxi = 100 ' total à obtenir
n =Range(plage).Cells.Count ' nombre de cellules de la plage à traiter
et j'ai pris une valeur "raisonnable" pour le tirage: de 1 à a
avec a = 2 * maxi \ n
mais tu peux la définir autrement
RQ. Je n'ai pas compris la même chose que cs_Le Pivert que je salue au passage
n =Range(plage).Cells.Count ' nombre de cellules de la plage à traiter
et j'ai pris une valeur "raisonnable" pour le tirage: de 1 à a
avec a = 2 * maxi \ n
mais tu peux la définir autrement
RQ. Je n'ai pas compris la même chose que cs_Le Pivert que je salue au passage
Izy3834
Messages postés
8
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
20 mars 2015
17 janv. 2015 à 22:25
17 janv. 2015 à 22:25
Merci infiniment pour votre aide! J'ai réussi à changer la borne supérieur par contre pour la borne inférieur je coince encore...
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
18 janv. 2015 à 11:35
18 janv. 2015 à 11:35
Pour un entier aléatoire h de a à b compris (a < b)
h = a + Int((b - a + 1) * Rnd)
Cdlmnt
h = a + Int((b - a + 1) * Rnd)
Cdlmnt
Izy3834
Messages postés
8
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
20 mars 2015
18 janv. 2015 à 12:48
18 janv. 2015 à 12:48
Bonjour,
je suis vraiment désolée de vous solliciter encore mais je bloque sur cette borne et c'est tout ce qui me sépare de mes résultats!
Par exemple si je veux une somme totale de 10000, une borne inférieure de 50, et une borne supérieure de 1000.
Je mets constmaxi = 10000
a=1000\n
b=1000 (en ayant mis plus haut b As long)
puis je remplace k = Int(a * Rnd) + 1 par
k=a+Int((b-a+1)*Rnd) dans le code mais malheureusement la borne inférieure n'est pas prise en compte, auriez-vous une idée?
merci beaucoup de votre aide
je suis vraiment désolée de vous solliciter encore mais je bloque sur cette borne et c'est tout ce qui me sépare de mes résultats!
Par exemple si je veux une somme totale de 10000, une borne inférieure de 50, et une borne supérieure de 1000.
Je mets constmaxi = 10000
a=1000\n
b=1000 (en ayant mis plus haut b As long)
puis je remplace k = Int(a * Rnd) + 1 par
k=a+Int((b-a+1)*Rnd) dans le code mais malheureusement la borne inférieure n'est pas prise en compte, auriez-vous une idée?
merci beaucoup de votre aide
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
Modifié par ccm81 le 18/01/2015 à 14:29
Modifié par ccm81 le 18/01/2015 à 14:29
Ta valeur de b (maxi pour le tirage) me semble bien grande, il faut la choisir nettement inférieure au total à obtenir
Un exemple
https://www.cjoint.com/?3AsoMGA6CSj
Attention lien modifié
Cdlmnt
Un exemple
https://www.cjoint.com/?3AsoMGA6CSj
Attention lien modifié
Cdlmnt
ccm81
Messages postés
10902
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 novembre 2024
2 425
Modifié par ccm81 le 18/01/2015 à 15:35
Modifié par ccm81 le 18/01/2015 à 15:35
Pour des valeurs un peu grandes (total=10000), il te faut prendre la dernière solution (tout en mémoire), sinon ça va se trainer un peu. Sans compter qu'il manque un test ici pour éviter le dépassement du maxi
Bonne fin de journée
If tot < total Then
d = total - tot
For k = 1 To d
a = 1 + Int(n * Rnd)
If Range(plage).Cells(a, 1) < maxi Then
Range(plage).Cells(a, 1) = Range(plage).Cells(a, 1) + 1
Else
k = k - 1
End If
Next
Bonne fin de journée
18 janv. 2015 à 15:22
Bon comme vous l'avez fait remarquer il ne faut pas prendre une valeur de b trop grande (ce qui est un peu contraignant car il s'agit de valeur de rayonnement et je ne choisi pas les ordres de grandeurs) mais ça devrait le faire.
Je n'ai pas encore essayé votre dernière manipulation mais en tout cas merci!!