8796 sujets

Développement web côté serveur, CMS

Hello; j'essaie de programmer un petit concours...
Les données de bases sont :

-5% de chances de gagner
-451 lots (nombre variable de lots)

J'ai trouvé une fonction de probabilité de laquelle je suis parti :

	function probability($chance, $out_of = 100) {
		$random = mt_rand(1, $out_of);
		return $random <= $chance;
	}


Mon idée était d'abord de regarder si j'avais gagné (5% de chances donc) puis de choisir un lot en fonction de leur quantité (et donc de leur probabilité de gain).

Mais j'ai deux problèmes, ou plutôt, une question et un problème :

1)est ce que ma démarche est correcte (calculer si l'on a gagné puis définir le lot en fonction des probabilités de gains) : se peut-il que l'on "gagne" au premier tour et puis qu'aucun lot ne soit défini lors du second calcul de probabilités ?

2) : il me retourne "Fatal error: Using $this when not in object context in F:\web\contest.php" pour la ligne

if (!self::probability($this->main_probability)) return false;


Je sais, c'est une erreur récurrente; mais je n'ai pas trouvé la solution... J'ai toujours programmé mes classes de cette manière (sous wordpress en tout cas) et ça a toujours fonctionné...

Voici la classe :


Class Contest {
	var $main_probability;
    var $prizes_1;
    var $prizes_2;
	var $prizes_3;
	var $prizes_4;
	var $prizes_total;
 
    function Contest() {
        $this->__construct();
    }
 
    function __construct() {
		$this->main_probability = 5;
		$this->prizes_1 = 300;
		$this->prizes_2 = 100;
		$this->prizes_3 = 50;
		$this->prizes_4 = 1;
		
		$this->prizes_total = $this->prizes_1 + $this->prizes_2 + $this->prizes_3 + $this->prizes_4;

    }
	
	function probability($chance, $out_of = 100) {
		$random = mt_rand(1, $out_of);
		return $random <= $chance;
	}
	
	function win_prize() {

	
	if (!$this->probability($this->main_probability)) return false; // 5% chance
	
		if (probability($this->prizes_1,$this->prizes_total))
			return '1';
		if (probability($this->prizes_2,$this->prizes_total))
			return '2';
		if (probability($this->prizes_3,$this->prizes_total))
			return '3';
		if (probability($this->prizes_4,$this->prizes_total))
			return '4';
	}
}

$contest = new Contest();

print_r($contest::win_prize());


merci pour votre aide !
Salut,

pour commencer il faut remplacer les if (probability... par if ($this->probability...

De toute façon ça ne fonctionnera pas puisque tu peux rentrer dans <= 5% est true et tous les autres tests sont à false.

Une proposition :
Class Contest {
	var $main_probability;
	var $lots;
 
    function Contest($main_probability=5, $lots=array(1, 50, 100, 300)) {
		$this->main_probability = $main_probability ;
		$this->lots = $lots;
    }
	
	function win_prize() {
		if (!(mt_rand(1, 100) <= $this->main_probability)) return false; // 5% chance
		$prix = mt_rand(1, array_sum($this->lots));
		$cumul = 0;
		foreach($this->lots as $key=>$lot) {
			$cumul += $lot;
			if($prix <= $cumul) return $key + 1;
		}
	}
}
Retours possibles :
false (perdu)
int(1) 1er prix
...
int(4) 4ème prix
Modifié par Heyoan (02 Feb 2010 - 19:41)
ça a l'air super Smiley smile
Quel tueur Smiley smile

Par contre il me sort toujours la même erreur :

Using $this when not in object context in

if (!(mt_rand(1, 100) <= $this->main_probability)) return false; // 5% chance 
gordie a écrit :
Par contre il me sort toujours la même erreur :
Using $this when not in object context in
Ah... Smiley confuse

Au cas où il s'agirait d'une erreur de copié / collé voici la page complète (avec 75% de chances de gagner) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Test</title>
</head>
<body>
<?php
Class Contest {
	var $main_probability;
	var $lots;
 
    function Contest($main_probability=5, $lots=array(1, 50, 100, 300)) {
		$this->main_probability = $main_probability ;
		$this->lots = $lots;
    }
	
	function win_prize() {
		if (!(mt_rand(1, 100) <= $this->main_probability)) return false; // 5% chance
		$prix = mt_rand(1, array_sum($this->lots));
		$cumul = 0;
		foreach($this->lots as $key=>$lot) {
			$cumul += $lot;
			if($prix <= $cumul) return $key + 1;
		}
	}
}

$contest = new Contest(75);
var_dump($contest->win_prize());
?>
</body>
</html>