Excel et VB : generer des nombres aléatoires

Discutez d'informatique ici !
MacErmite
Membre Relatif
Messages: 408
Enregistré le: 12 Mai 2006, 13:00

Excel et VB : generer des nombres aléatoires

par MacErmite » 01 Déc 2009, 23:37

Bonjour à tous,

Je cherche, avec l'écriture d'une fonction sous VB de excel, un algorithme me permettant de genérer des nombres aléatoires compris de [a;b] dans une colonne mais avec une probabilité de n ligne à remplir sur le nombre total de ligne, les autres lignes étant noté d'une chaine de caractère "Vide" ....

ex :
L1 10
L2 5
L3 7
L4 vide
L5 1
L6 vide

ici il y a 6 lignes avec 4/6 lignes avec des nombres et 2/6 avec la chaine "vide"

Pour générer les nombres aléatoires j'ai pris la fonction Rnd combiner avec la fonction Int. Mais comment répartir correctement les nombres générer avec la chaine de caractère ?

Pouvez-vous m'aider ?

Merci.



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 03 Déc 2009, 12:49

salut,

sauf erreur, random suit une loi uniforme.
Tu subdivises l'intervalles [0;1] en 6 parties. Ca fait ton dé.
Tu lances un premier random qui remplit toute tes colonnes sur [a;b]

Pour chaque ligne, tu lance un random. S'il tombe sur la premiere partie, alors tu mets la ligne a vide. Sil tombe sur la seconde partie, idem.
(l'idée c'est juste de choisir deux parties (pour avoir ton quota 2/6))
la vie est une fête :)

MacErmite
Membre Relatif
Messages: 408
Enregistré le: 12 Mai 2006, 13:00

par MacErmite » 04 Déc 2009, 22:48

Je n'ai pas compris ton explication alors j' ai écris cette fonction, sauf que je n'arrive pas à creer des cellules "abs" ...

Function rndNote(ByVal noteMax As Long, ByVal debutplage As Integer, ByVal finplage As Integer) As Integer

nbcellule = (finplage - debutplage) + 1
rndNote = Rnd * noteMax
tauxAbs = 4 / 10
nbabs = Int(nbcellule * tauxAbs)
End Function

une idée ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 04 Déc 2009, 23:19

pour ton idée :
a partir du moment ou tu as déterminé le nombre de abs (qui du coup n'est plus du tout pratique, vu que tu le fixes), tu peux faire une boucle.
Pour chaque valeur de 1 a nbAbs, tu fais un random sur [1:nbCellules]. Tu prend la valeur arrondie la plus proche, et tu lui foue abs.

Ce que je te proposais, c'est de justement pas fixer le nombre nbAbs. Tu fixes une fréquence de tauxAbs, mais sans pour autant savoir si apres tu auras exactement le rapport attendu.
la vie est une fête :)

MacErmite
Membre Relatif
Messages: 408
Enregistré le: 12 Mai 2006, 13:00

par MacErmite » 05 Déc 2009, 00:09

Je bloque sur le fait que je ne peux pas inserer des boucles dans cette fonction



Function rndNote2(ByVal noteMax As Long, ByVal debutplage As Integer, ByVal finplage As Integer) As Integer
nbcellule = (finplage - debutplage) + 1

tauxAbs = 4 / 10
nbabs = Int(nbcellule * tauxAbs)

rndNote2 = releveNote(noteMax)

For j = 1 To nbcellule
If nbabs = 0 Then Exit For
If j > nbabs Then Exit For
rndligne = Int((finplage - debutplage + 1) * Rnd + debutplage)
Cells(rndligne, ActiveCell.Value).Value = "Abs"
Next j


End Function

Function releveNote(ByVal noteMax As Integer)
releveNote = Rnd * noteMax
End Function


Sans la boucle, écrite en caractère gras, la fonction marche. Je vais dans la feuille excel et tape dans une cellule =rndNote2 avec la selection de la note max, le debut et la fin de la plage (colonne voisine notée de 1 à 10)

MacErmite
Membre Relatif
Messages: 408
Enregistré le: 12 Mai 2006, 13:00

par MacErmite » 05 Déc 2009, 01:53

J'ai tout revu et cela donne ceci :

Function rndNote2(ByVal noteMax As Long) As String
rndDe = Int(Rnd * 10)
rndNote2 = releveNote(noteMax, rndDe)
End Function

Function releveNote(ByVal noteMax As Integer, ByVal rndDe As Integer)
If rndDe >= 1 Then
releveNote = Int(Rnd * noteMax)
Else
releveNote = "vide"
End If
End Function

pour avoir par exemple 90/100 de nombre et 10/100 de vide

ton avis ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 05 Déc 2009, 09:56

désolé, je pige pas tes fonctions. Ce qu'elle font. Ni même le sens de rndDe et rndNote2.

Puis bon, l'algo, même si c'est du vb, en francais ca va bien aussi! Après c'est de la syntaxe...
la vie est une fête :)

phryte
Membre Irrationnel
Messages: 1406
Enregistré le: 05 Juil 2008, 18:09

par phryte » 11 Déc 2009, 16:50

Bonjour.
Une idée :
Pour un nombre entre a et b avec c chances sur d :
Code: Tout sélectionner
Function nbalea(a, b, c, d)
 Dim table(10) 
For i = 1 To d
table(i) = 0 
 Next 
For i = 1 To c 
 table(i) = 1 
 Next
nbalea = Int(a + (b - a) * Rnd) * table((Int(d * Rnd)))
 End Function

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite