Bonjour je sais pas trop comment poser la question et mettre un titre très clair.
J'ai une table avec 250 items (des syllabes), je veux tirer au hasard dans la table mais:
- les probabilités de tirer en début de table sont bcp plus fortes que de tirer à la fin parce que mes syllabes sont plus communes en début de tables et plus rares en fin de table.
Comment je fais ça en code ou pseudo code? en js? C'est de l'algo mais je vois pas bien... mes cours de maths snt très très loins...
C'est pour jouer avec du js (avec un microcontroleur espruino et une carte son).
Une idée?
merci infiniment
Qui mange un noix de coco entière fait confiance à son anus
salut, si tu postes dans le forum de maths, tu auras sans doute plein de réponses intéressantes. J ai pensé à ça : edit : c’est pas genial, seuls les tous premiers ressortent, il faudrait l’ameliorer.
<script>
var total = 50, tour = 1;
trouver();
function trouver(){
console.log("tour "+tour++);
for (var i=0;i<total;i++){
var ratio = total-i;
var proba = ratio/80;//nimporte quel chiffre plus grand que total
var rand = Math.random();
console.log("rand = "+rand+" , proba= "+proba)
if (rand <= proba) return i;
if (i==total-1) return trouver();
}
}
</script>
Tu pourrais éventuellement utiliser une fonction parabolique du second dégrée. Ensuite tu détermine min est max avec min = f(250) et max = f(0). Lorsque tu vas obtenir ton chiffre aléatoire, tu résous ton équation pour connaitre x f(x)= 5000 donc x=? Et comme la fonction est parabolique, il y a plus de probabilité pour obtenir l'une des deux partie de ton array.
Si la parabole par de 0 pour aller vers le haut, alors tu aura plus de probabilité d'obtenir une entrée en fin de tableau. Sinon si la parabole par de 0? pour aller vers le bas (parabole a l'envers), alors tu aura plus de probabilité d'obtenir un entré en début de tableau.
Je sais pas si je suis claire xd Donc voici un exemple :
//retourne un chiffre entre min et max.
//min et max inclu. 0-9
const random= (min,max)=> {
let m= Math.ceil(min), M= Math.floor(max);
return Math.floor(Math.random()*(M-m+1))+m;
};
//f(x) = -0.5*x²+50
const f= (x)=> { return (-0.5*Math.pow(x,2))+50;};
//resolution de mon equation
const deF= (x)=> {
x= x-50;
x= x/-0.5;
return Math.sqrt(x);
};
//récupére un index random
const rIR= (array)=> {
let rand= random(f(array.length-1), f(0));
let indx= Math.round(deF(rand));
return array[indx];
};
//array d'exemple
var monArray= ["a", "e", "i", "o", "u", "x", "y", "z", "0", "1"];
//boucle de test
for(let a=0;a<20;a++) {
console.log(rIR(monArray));
};
Dans mon exemple, les dernière valeur de mon array ressorte plus souvent que les première entrer. Ps: pour le résultat inverse, a défaut de modifier la fonction, il est possible d'utiliser .reverse()
Edit: Voici une boucle qui parcours chaque résultat aléatoire possible et affiche l'entrée du tableau associée :
Ah, c'est vrai que je me suis un peu mal exprimé. Tu veux tirer une fois chaque élément de ton tableau si j'ai bien compris, donc ça reviens à mélanger ton tableau de base, et prendre les valeurs du nouveau tableau 1 par 1, ou sinon tu peux mélanger le tableau et créer un nombre aléatoire entre 0 et 249.
Bonjour, Poster un lien en anglais sur un forum francophone alors que le même article existe en français... mdr. Donc d'après cette article l'algorithme dont tu parle sert juste a mélanger un ensemble d'objets.
Mes fonction sont lisible, je ne comprend pas où réside la difficulté dans leurs compréhension ? La dernière boucle, celle qui fait 20 tirage, sert juste a titre d'exemple.
Par exemple, si tu souhaite faire un mot de 7 syllabes, tu fait une boucle de 7 tirage et tu met les syllabes bout à bout. Tout simplement.
La toute dernière c'est une boucle qui parcours toute les possibilité de tirage possible avec la fonction que j'ai "crée". C'est juste pour avoir une idée du nombre de chance qu'à une valeur d'être "tirer au sort". Dans mon exemple, z a 7 chance sur 41 d'être tirer au sort, alors que e n'a qu'une chance sur 41.
Donc pour t'expliquer plus simplement, tu as une équation du second dégrée (graphiquement, ça doit te dessiner une parabole sur ton repère orthonormée). Cette équation te dit "pour x = 0, f(x) = 2600" et "pour x = 250, f(x) = 12". Tu te sert de cette fonction pour obtenir un intervalle dans lequel tu vas tirer un nombre aléatoire (pour continuer avec les même chiffre, ici l'intervalle c'est [12;2600])
Une fois que tu as définie cette intervalle, tu "tire au sort" un chiffre dans cette intervalle (pour l'exemple on vas dire 12). Pour associer ce nombre a l'une des valeurs de ton tableau, tu doit ensuite résoudre l'équation en fonction de la valeur "tirer au sort". (12=f(250))
Les chiffre suivant sont bidon, et seulement là a titre d'exemple. Quand tu résous ton équation, 12 correspond à 250. Et 27 correspond à 250,49999. Comme tu arrondi a l'entier le plus proche on peut donc "dire" que tout les nombre de 12 à 27 sont égale à 250.
Tu comprend ce que j'essaye d'expliquer ?
- Edité par Angelisium 11 décembre 2018 à 18:09:27
J'ai suivi le conseil de @Paulou et j'ai reposé la question su le forum Math où j'ai obtenu l'algo que je recherchais, servi avec bcp de pédagogie. Je l'ai réécrit en js rapidement.
il tient en 3 lignes et sans fonction fléchée.
Je suis venu chercher de l'aide sur le forum, pas des leçons, ni l'humiliation.
Tout le monde n'a pas ton aisance du code @Angelisium. Je te dis que les fonctions fléchées sont du Klingon pour moi. Tu me rétorques que tout est lisible et que tu ne comprends pas où est la difficulté... C'est de toute évidence, pas la pédagogie qui te pousse à répondre sur ce forum...
Qui mange un noix de coco entière fait confiance à son anus
Pour info, c'est juste la déclaration de la fonction qui est différente. Une fonction fléchée change le this de la fonction, ce qui est utile (ou problématique) avec certains framework. () => {...} c'est équivalent à function () {...}, a => b c'est équivalent à function(a) {return b}.
Concernant ton problème, je pense que tu peux t'en sortir juste avec un tableau en fait. Je ne comprends pas bien ton problème, et je ne sais pas si tu fais des tirages succésifs avec (ou sans) remise, c'est le point le plus important. Avec le tableau suivant [a, b], si tu veux avoir deux fois plus de chances de tirer a plutôt que b, il te suffit de prendre un indice aléatoire du tableau [a, a, b]. Si tu veux faire des tirages sans remises et que tu veux autant de chances de tirer a ou b, tu n'as qu'à mélanger le tableau, ton premier tirage corresponds au premier indice, etc.
j'ai 250 valeurs dans ma table... je vais pas doubler ou tripler les valeurs.
la technique proposée est de mettre au carré ma longueur de table et de tirer sur cette longueur puis de passer à la racine et de fait j'ai plus de valeur proches de 250 que de valeurs proches de 0... (sur x tirages)
comme je veux l'inverse, je soustrais mon tirage à 250 et j'ai donc plus de tirage en début de table qu'en fin de table.
"et voilà"
merci pour l'éclaircissement des fonctions fléchées.
- Edité par mrbbp 11 janvier 2019 à 9:41:16
Qui mange un noix de coco entière fait confiance à son anus
En disposant d'un tableau des fréquences des syllabes (par exemple (frq=[20,19,17,10,12,16,8,7,5,1] pour 10 valeurs et non 250), il suffirait de cumuler celles-ci frqCum=[20,39,46,56,67,83,91,98,103,104] puis de tirer un nombre psendo-aléatoire compris entre 0 et 104 (la somme de ces valeurs limites - var nmb=Math.floor(Math.random()*104) pour déterminer le rang de cette valeur dans le tableau des fréquences cumulées et donc la syllabe correspondante avec une probabilité conforme aux fréquences initiales
Tout le monde n'a pas ton aisance du code @Angelisium. Je te dis que les fonctions fléchées sont du Klingon pour moi. Tu me rétorques que tout est lisible et que tu ne comprends pas où est la difficulté... C'est de toute évidence, pas la pédagogie qui te pousse à répondre sur ce forum...
Et bien détrompe toi, je ne pensais tout simplement pas que c'était la fonction fléché qui posais problème. Je pensais que c'était l’intérieur des fonctions qui posais problème.
Il serait bon de mettre la solutions ici, parce que le forum Math, c'est un peu vague pour celui qui as le même problème et qui tombe sur ce sujet.
!
!
!