Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

aléatoire pondéré

9 réponses
Avatar
mathieu.lory
Bonjour,

Je cherche =E0 faire un javascript qui retourne un id (pour un array)
al=E9atoirement mais dont les =E9l=E9ments de ce tableau sont pond=E9r=E9 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 =3D new Array(
Array("nom du premier =E9l=E9ment", 0.5),
Array("nom du 2=E8me =E9l=E9ment", 0.5),
);

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

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

9 réponses

Avatar
diablo
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

Avatar
SAM
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

Avatar
mathieu.lory
Ah, ben tout le travail est fait !! je viens de l'intégrer dans mon
code et ça marche du premier coup !!
Avatar
SAM
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

Avatar
Olivier Miakinen

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 :
<news:
<http://groups.google.fr/group/fr.sci.maths/msg/75f4c7551085ea3a?hl=fr&gt;

Avatar
SAM
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 :
<news:
<http://groups.google.fr/group/fr.sci.maths/msg/75f4c7551085ea3a?hl=fr&gt;


et qu'est ce donne :
<http://groups.google.fr/group/fr.sci.maths/msg/c8d192189a5583b0&gt;
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


Avatar
Olivier Miakinen

et qu'est ce donne :
<http://groups.google.fr/group/fr.sci.maths/msg/c8d192189a5583b0&gt;
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.

Avatar
SAM
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 :
<http://groups.google.fr/group/fr.sci.maths/msg/75f4c7551085ea3a?hl=fr&gt;

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>



Avatar
Olivier Miakinen

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.