Valeur au hasard, mais selon probabilité [Résolu]

mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 4 févr. 2013 à 22:17 - Dernière réponse : cs_stay 496 Messages postés jeudi 7 juillet 2005Date d'inscription 24 mai 2017 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_stay 496 Messages postés jeudi 7 juillet 2005Date d'inscription 24 mai 2017 Dernière intervention - 7 févr. 2013 à 00:14
1
Merci
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

Merci cs_stay 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de cs_stay
NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscription 22 septembre 2018 Dernière intervention - 4 févr. 2013 à 23:22
0
Merci
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
---
Commenter la réponse de NHenry
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 5 févr. 2013 à 09:15
0
Merci
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++
Commenter la réponse de mailliam
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 15 févr. 2013 à 13:53
0
Merci
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++
Commenter la réponse de mailliam
cs_stay 496 Messages postés jeudi 7 juillet 2005Date d'inscription 24 mai 2017 Dernière intervention - 15 févr. 2013 à 14:34
0
Merci
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
Commenter la réponse de cs_stay

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.