aléatoire pondéré

Le
mathieu.lory
Bonjour,

Je cherche à faire un javascript qui retourne un id (pour un array)
aléatoirement mais dont les éléments de ce tableau sont pondéré po=
ur
leur donner plus ou moins d'importance. (j'ai mis un pourcentage pour
le moment)

En gros : j'ai un tableau
var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5),
);

Ainsi, je souhaite appeller une fonction Js qui me retourne 1 et un
seul élément de ce tableau. Avec le tableau de l'exemple ci-dessus, je
souhaite donc une équiprobabilité sur les 2 éléments. Par conséque=
nt,
je je fais 100 tirages, alors potentiellement j'aurais 50 fois le 1er
éléments qui sortira.

Savez vous comment je peux faire en javascript ?
NB : bien sur, les pondérations sont des variables :-)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
diablo
Le #778614
Bonjour,

Je cherche à faire un javascript qui retourne un id (pour un array)
aléatoirement mais dont les éléments de ce tableau sont pondéré pour
leur donner plus ou moins d'importance. (j'ai mis un pourcentage pour
le moment)

En gros : j'ai un tableau
var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5),
);

Ainsi, je souhaite appeller une fonction Js qui me retourne 1 et un
seul élément de ce tableau. Avec le tableau de l'exemple ci-dessus, je
souhaite donc une équiprobabilité sur les 2 éléments. Par conséquent,
je je fais 100 tirages, alors potentiellement j'aurais 50 fois le 1er
éléments qui sortira.

Savez vous comment je peux faire en javascript ?
NB : bien sur, les pondérations sont des variables :-)


google -> "javascript random"

hf

ps : pour tes poids, j'utiliserais cette methode indirecte :
-> plutot que d'assigner des poids à tes différents éléments
multiplies-les, je veux dire par là que tu devrais créer
plusieurs éléments identiques, ce devrait donner à peu de
chose près le même résultat

--
-uTb#`diablo PWed by GNU/Linux Debian on Diablo

SAM
Le #778612
Bonjour,

Je cherche à faire un javascript qui retourne un id (pour un array)
aléatoirement mais dont les éléments de ce tableau sont pondéré pour
leur donner plus ou moins d'importance. (j'ai mis un pourcentage pour
le moment)


<html>
<script type="text/javascript">
var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5)
);

function aleatoire(tablo) {
var idx = 0, R = [], long=0;
for(var i=0; i<tablo.length; i++) {
long = tablo[i][1]*10;
for(var j=0; j<long; j++) {
R[idx] = tablo[i][0];
idx++;
}
}
return R[Math.floor(Math.random()*R.length)];
}
</script>
<p><button onclick="
document.getElementById('inf').innerHTML+='n+ '+aleatoire(tableau);"
go</button></p>
<pre id="inf"></pre>

</html>


--
sm

mathieu.lory
Le #778611
Ah, ben tout le travail est fait !! je viens de l'intégrer dans mon
code et ça marche du premier coup !!
SAM
Le #778610
Ah, ben tout le travail est fait !! je viens de l'intégrer dans mon
code et ça marche du premier coup !!


Il vaudra sans doute mieux créer l'array modifié en fonction des
pondérations et ne faire un aléa que sur ce nouveau tableau.

Le truc donné fait ça (créer un nouvel array) mais à chaque appel de la
fonction.
Pour 2 trucs ça va mais pour 275 ... ? avec des coef 0.9 ou 1.5


--
sm

Olivier Miakinen
Le #778609

Je cherche à faire un javascript qui retourne un id (pour un array)
aléatoirement mais dont les éléments de ce tableau sont pondéré pour
leur donner plus ou moins d'importance. (j'ai mis un pourcentage pour
le moment)

[...]

Savez vous comment je peux faire en javascript ?
NB : bien sur, les pondérations sont des variables :-)


Un algo possible (sans dupliquer les variables N fois dans un autre
tableau) a été donné cette semaine dans fr.sci.maths :

SAM
Le #778608
Je cherche à faire un javascript qui retourne un id (pour un array)
aléatoirement mais dont les éléments de ce tableau sont pondéré pour
leur donner plus ou moins d'importance. (j'ai mis un pourcentage pour
le moment)

[...]

Savez vous comment je peux faire en javascript ?
NB : bien sur, les pondérations sont des variables :-)


Un algo possible (sans dupliquer les variables N fois dans un autre
tableau) a été donné cette semaine dans fr.sci.maths :


et qu'est ce donne :
traduit en JS ?

paske là ... j'ai rien compris ...
kessekecé :
In[1]:= cc={1000,100,10,10,5};


Je crois que la finalité du truc chez les matheux est encore + sioux :
on diminue la pondération du machin x s'il a déjà été tiré.

--
sm


Olivier Miakinen
Le #778607

et qu'est ce donne :
traduit en JS ?


Euh...

paske là ... j'ai rien compris ...
kessekecé :
In[1]:= cc={1000,100,10,10,5};


Mathematica est un logiciel hyperspécialisé pour les mathématiques. Je
dis ça alors que je ne l'ai jamais utilisé, mais je ne serais pas étonné
qu'il ait en standard des fonctions pour calculer des exponentielles de
matrices ou des intégrales triples. En tout cas, le programme donné dans
l'article que tu cites n'est pas une implémentation de l'algorithme
donné dans l'article que je citais moi-même.

Je crois que la finalité du truc chez les matheux est encore + sioux :
on diminue la pondération du machin x s'il a déjà été tiré.


Non, non, pas du tout. Je vais essayer de le traduire en JavaScript, en
repartant de l'exemple que tu avais donné.

<html>
<script type="text/javascript">
var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5)
);

function sommepoids(tablo) {
var somme = 0;
for (var i = 0; i < tablo.length; i++) {
somme += tablo[i][1];
}
return somme;
}

var sommetotale = sommepoids(tableau);

function aleatoire(tablo,total) {
var alea = Math.random() * total;
var somme = 0;
for (var i = 0; i < tablo.length; i++) {
somme += tablo[i][1];
if (somme > alea) {
return tablo[i][0];
}
}
/* ce cas ne devrait pas arriver : */
return tablo[tablo.length-1];
}
</script>
<p><button onclick="
document.getElementById('inf').innerHTML + 'n+ ' + aleatoire(tableau,sommetotale);"
go</button></p>
<pre id="inf"></pre>

</html>

On pourrait bien sûr calculer sommetotale à l'intérieur de aleatoire(),
surtout si on ne s'en sert qu'une seule fois.

SAM
Le #778363
et qu'est ce donne :


Je vais essayer de le traduire en JavaScript, en
repartant de l'exemple que tu avais donné.


Ha! en effet, j'y retrouve bien l'idée exposée dans le post :

Ne faudrait-il pas d'abord trier le tableau sur la pondération ?
dans la mesure où on l'exploite suivant un ordre progressif.

Bon, avec un array de 2 éléments (de même poids !) pas facile de juger ;-)

<html>
<script type="text/javascript">
var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5)
);

function sommepoids(tablo) {
var somme = 0;
for (var i = 0; i < tablo.length; i++) {
somme += tablo[i][1];
}
return somme;
}

var sommetotale = sommepoids(tableau);

function aleatoire(tablo,total) {
var alea = Math.random() * total;
var somme = 0;
for (var i = 0; i < tablo.length; i++) {
somme += tablo[i][1];
if (somme > alea) {
return tablo[i][0];
}
}
/* ce cas ne devrait pas arriver : */
return tablo[tablo.length-1];
}
</script>
<p><button onclick="
document.getElementById('inf').innerHTML + > 'n+ ' + aleatoire(tableau,sommetotale);"
go</button></p>
<pre id="inf"></pre>

</html>



Olivier Miakinen
Le #778362

Ne faudrait-il pas d'abord trier le tableau sur la pondération ?
dans la mesure où on l'exploite suivant un ordre progressif.


Non, cela n'a aucune importance. De même, les poids peuvent être entiers
ou pas, et il peut même y en avoir un nul qui ne sera jamais choisi. En
revanche il ne faut pas de poids négatif. Par ailleurs, si on s'arrange
à l'avance pour que la somme des poids soit égale à 1 (comme dans
l'exemple donné), il est à priori inutile de la recalculer.

Bon, avec un array de 2 éléments (de même poids !) pas facile de juger ;-)


Yapluka essayer avec un autre exemple :

var tableau = new Array(
Array("nom du premier élément", 0.5),
Array("nom du 2ème élément", 0.5),
Array("nom du 3e élément", 1.5)
);

Le 3e élément devrait être choisi trois fois plus souvent que chacun des
deux autres.

Publicité
Poster une réponse
Anonyme