Fonction de tirage aléatoire (probabilités)

WRInaute discret
Bonsoir ! :)

Dans le cadre d'une utilisation bien particulière, j'ai trouvé et adapté cette fonction qui permet d'effectuer un "tirage aléatoire" avec prise en compte de probabilités.

La fonction rand() de PHP fonctionne, ainsi que mt_rand, mais je trouve qu'elles ne respectent pas suffisamment les probabilités...

Code:
<?php
function ProbaRand()
{
	$arg_list=func_get_args();

	$tablo=array();

	$start=0;

	foreach($arg_list as $arg_curr)
	{
		if(!is_array($arg_curr)){return (false);}

		$tempo=array();

		list($tempo['name'], $tempo['probability'])=$arg_curr;

		$tempo['start']=$start;
		$tempo['end']=($start + $tempo['probability']);

		$start+=$tempo['probability'];

		array_push($tablo, $tempo);
	}

	$result=mt_rand(0, 1000)/1000;

	foreach($tablo as $once)
	{
		if($result>=$once['start'] && $result<=$once['end'])
		{
			return($once['name']);
		}
	}
}

$tmp_rand=ProbaRand(
	array('1', 0.25), 
	array('2', 0.60), 
	array('3', 0.05), 
	array('4', 0.10)
);
?>

Simple question : comment adapter cette fonction afin de définir des probabilités en fonction d'un membre et non pour tous les internautes en général ?

Je m'explique :

Si je dis : les membre "A" et "B" ont 10% de chances de tomber sur "1", 60% de chances de tomber sur "2" et 30% de chances de tomber sur "3".

En clair, les deux membres qui ouvrent la page contenant cette fonction ont les mêmes chances de tomber sur l'une ou l'autre des possibilités...

Cependant, l'un peut tomber beaucoup plus souvent sur l'une ou l'autre... Et l'autre, ne jamais tomber dessus, étant donné que les membres utilisent cette fonction l'un après l'autre.

En gros, comment faire pour que la fonction offre les mêmes probabilités aux deux membres ?
 
WRInaute impliqué
tu souhaite avoir un truc aléatoire comme tu semble avoir actuellement, et donc potentielement avoir si t'as pas de bol plus de fois la même page, mais avec un grand nombre de tirages la probabilité d'avoir ce que tu veux augmente

ou bien, répartir équitablement tes pages de telle sorte que tu as par exemple sur les 100 derniers tirages déjà sorti le 1 10 fois donc tu va faire un tirage entre le 2 et le 3 ?
 
WRInaute discret
Bonsoir, bonsoir !! ;)

Et bien décidément on a rapidement une réponse sur ce forum !! Merci ! ;)

En fait, pour m'expliquer un peu mieux, j'ai deux tables :

> "membres" : la liste des membres
-> "liens" : une liste de sites

Quand un membre arrive sur une page, j'utilise actuellement cette fonction (cf ci-dessus) pour piocher un lien au hasard...

Imaginons que j'ai 2 liens avec une probabilité à 50% sur chacun...

Le membre "A" peut très bien tomber sur le lien 1 ;
Puis le membre "B" sur le lien 2 ;
Et là, le problème, c'est que le membre "A" qui revient, va pratiquement tout le temps tomber sur le lien 1 (comme tout à l'heure, pour respecter la probabilité)

Alors en gros, il faudrait que cette probabilité s'applique uniquement au membre.

Par exemple, au lieu d'utiliser ProbaRand(), j'utiliserais plutôt ProbaRand(17), où "17" est le numéro du membre.
Ainsi, chaque membre aura exactement les mêmes chances de tomber sur les mêmes liens.

C'est difficile de l'expliquer ainsi, mais en réalité mon problème est que c'est souvent les mêmes membres qui tombent sur les mêmes liens, car ils se connectent sur cette page à longueur de journée et souvent l'un après l'autre (ils reviennent toutes les heures, à la même fréquence, donc en gros le membre "A" qui s'est connecté à 8h07 va systématiquement revenir à 9h07... :))
 
WRInaute impliqué
plus le type va revenir et plus ce 50% sur chaque lien sera correct

sinon

tu peux rajouter une table qui contient la liste des nombres trouvés par membre et ainsi à chaque fois que tu veux sortir un nombre aléatoire pour ce membre tu compte le nombre de fois qu'il est déjà tombé sur le lien 1, 2 ou 3
tu peux faire une table avec
id_membre numero_page nombre_de_fois (ou il est tombé sur celle la)

tu fais la somme des "nombre de fois" pour le membre, et ensuite tu calcule le pourcentage de chacun et celui qui dévie au maximum de la probabilité que tu veux donner à la page, tu lui donne .Exemple s'il a visité 2 fois la page 1 en 2 tirages, la page 1 est censé être à 50%, mais elle est à 100% (diff = 50). La page 2 est censé être à 50%, elle est à 0% (diff = 100)
donc tu sors la page 2

en cas d'égalité de % tu fais un rand comme t'as déjà
 
WRInaute impliqué
Le membre "A" peut très bien tomber sur le lien 1 ;
Puis le membre "B" sur le lien 2 ;
Et là, le problème, c'est que le membre "A" qui revient, va pratiquement tout le temps tomber sur le lien 1 (comme tout à l'heure, pour respecter la probabilité)


Ce que tu dis n'a pas de sens ...

Mais si tu veux être sur qu'il n'y a aucune corrélation entre visiteur 1 et visiteur 2, tu as juste à réinitialiser le moteur de nombre aléatoire a chaque visites comme ceci :

Code:
mt_srand($seed);
$randval = mt_rand();

A toi de définir la valeur de seed, on utilise généralement des fonctions se basant sur microtime() pour le générer, mais ca peut être lui même un nombre aléatoire.
 
Discussions similaires
Haut