Valeur au hasard, mais selon probabilité

Résolu
mailliam Messages postés 261 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 10 mars 2014 - 4 févr. 2013 à 22:17
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 - 15 févr. 2013 à 14:34
Bonjour à tous!

J'aimerais sélectionner au hasard une valeur selon plusieurs valeurs connues, mais avec une probabilité différente de sortir pour chacune.

C'est-à-dire:
Valeur1 50% de chance de sortir
Valeur2 40% de chance de sortir
Valeur3 10% de chance de sortir

J'ai cherché et j'utilise array_rand de cette façon:
$tablo = array("Valeur1", "Valeur1", "Valeur1", 
"Valeur2", "Valeur2", "Valeur3");

$valeur = array_rand($tablo, 2);

echo $tablo[$valeur[0]];

Seulement avec cette méthode je dois mettre plusieurs fois la même valeur dans mon tableau afin d'augmenter ses chances..

Comment pourrais-je faire pour mettre une fois chaque valeur, avec un pourcentage pour chacune?

Si quelqu'un à une idée, ou une suggestion j'suis preneur

Merci et bonne semaine!
A voir également:

5 réponses

cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
7 févr. 2013 à 00:14
Salut, je vois que tu as donnée ta langue au chat :)

En moins d'un car d'heure :).
Je propose un tableau avec une clé qui limite la valeur initial vers la seconde, si il y a une seconde valeur bien-sûr :).

<?php
$a_values = array(
    "1-5" => 50,
    "6" => 10,
    "7" => 10,
    "8" => 10,
    "9-10" => 20
);
$i_result = rand(1, 10);
echo 'Je suis le '.$i_result.'
';
echo getPercentage($a_values, $i_result);
echo '
';

$a_values = array(
    "1-50" => 50,
    "51-60" => 10,
    "61-70" => 10,
    "71-80" => 10,
    "81-100" => 20
);
$i_result = rand(1, 100);
echo 'Je suis le '.$i_result.'
';
echo getPercentage($a_values, $i_result);
echo '
';

function getPercentage($a_values, $i_result) 
{
    foreach ($a_values as $i_num => $s_percentage) {
    	$a_num = (array) explode("-", $i_num);
    	if ((isset($a_num[1])) && ($a_num[0] <= $i_result) && ($a_num[1] >= $i_result)) {
    	    $s_result = (string) sprintf('Le %d a %d&#37; de chance', $i_result, utf8_decode($s_percentage));
    	} elseif ($i_num === $i_result) {
    	    $s_result = (string) sprintf('Le %d a %d&#37; de chance', $i_result, utf8_decode($s_percentage));
    	}
    }
    
    return (string) $s_result;
}


stéph
2
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
4 févr. 2013 à 23:22
Bonjour,

Tu peux faire 2 tableaux, 1 avec les proba, l'autre avec les données
Dans les probas, tu mets le nombre de chance d'apparition (5, 4, 1).

Puis, tu fais la somme des valeurs du tableau (ici 10), puis tu fais un générateur aléatoire de 0 à la somme-1.

Puis tu parcours le tableau, si case inférieur à la valeur du tirage, alors, Tirage=Tirage-Case, sinon, tu prends la case.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
mailliam Messages postés 261 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 10 mars 2014 3
5 févr. 2013 à 09:15
Tcho!

Merci bcp pour ta réponse et surtout si rapide : )
Par contre j'ai beau relire plusieurs fois, je comprends pas tout!

Ca j'ai compris:
Tu peux faire 2 tableaux, 1 avec les proba, l'autre avec les données
Dans les probas, tu mets le nombre de chance d'apparition (5, 4, 1).
Puis, tu fais la somme des valeurs du tableau (ici 10), puis tu fais un générateur aléatoire de 0 à la somme-1.

Par contre:
Puis tu parcours le tableau, si case inférieur à la valeur du tirage, alors, Tirage=Tirage-Case, sinon, tu prends la case.

Si j'ai par exemple un tirage de 8, si case inférieur à la valeur du tirage donnerait: Tirage=tirage-case donc (8-5) c'est bien ca?
mais ca me donne 3 donc c'est pas juste..

ça doit être tout con, mais je saisi pas là
A++
0
mailliam Messages postés 261 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 10 mars 2014 3
15 févr. 2013 à 13:53
Tcho!

Merci énomrément pour ta réponse!! C'est exactement ce que je voulais faire!
Tu dis j'ai laissé tomber en moins d'un quart d'heure, non non j'ai pas laissé tomber mais comme j'avais une façon de faire qui fonctonnait, je ne me suis pas repenché sur ce problème, mais ma façon était bien moins précise!

Je vais refaire un tableau pour pouvoir mettre des valeurs "alphabéthiques" plut^t que des chiffres, et ce sera parfait pour moi

Sympa, encore merci!
A++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
15 févr. 2013 à 14:34
Super, avec plaisir. J'ai trouvé l'exercice amusant.
Mais quand je disais "en moins d'un quart d'heure", je parlais du temps que j'ai mis à le créer :)
A++

stéph
0
Rejoignez-nous