[python] application d'une formule de proba

Templier Nocturne Messages postés 9989 Statut Membre -  
Templier Nocturne Messages postés 9989 Statut Membre -
Bonjour,

je dispose d'une formule de probabilité :

http://img4.hostingpics.net/pics/438781equation.png

ainsi que de sa translation en PHP :

function factorielle($valeur){
	$fact = 1;
	for($i = 1; $i <= $valeur; $i++)
		$fact *= $i;
	return $fact;
}

function combinaison($k, $n){
	return (factorielle($n) / (factorielle($k) * factorielle($n - $k)));
}

function maFonction($a, $b, $c){
	$resu = 0;
	for($k = $c + 1; $k <= $b; $k++){
		$temp = combinaison($k, $b);
		$temp *= pow((1/$a), $k);
		$temp *= pow((1 - 1/$a), $b - $k);
		
		$resu += $temp;
		
	}
	$resu = $resu * 100;
	$resu = 100 - $resu;
	return round($resu,3);
}


cependant, quand je la traduit en python, ça marche pas :/

voilà mon code :

def survival(request):
	a = request.GET.get('a','')
	b = request.GET.get('b','')
	c = request.GET.get('c','')
	
	
	def facto(valeur):
		x = 1
		fact = 1
		while x < valeur:
			fact = fact * x
			x = x + 1
		return fact

	def combinaison(k, n):
		return facto(n) / ( facto(k) * facto(n - k) )

	def mafonction(a, b, c):
		if a != '' and b != '' and c != '':
			a = int(a)
			b = int(b)
			c = int(c)
			resu = 0
			k = c + 1
			while k <= b:
				temp = combinaison(k, b)
				temp = temp * ((1 / a)**k)
				temp = temp * (1 - 1/a)**( b - k)
				resu = resu + temp
				k = k + 1
			resu = resu * 100
			resu = 100 - resu
			return round(resu, 3)
		else:
			return False

	def mafonction2(a, b, c):
		if a != '' and b != '' and c != '':
			a = int(a)
			b = int(b)
			c = int(c)
			resu = 0
			k = c + 1
			while k <= b:
				temp = combinaison(k, b)
				temp = temp * ((1 / a)**k)
				temp = temp * (1 - 1/a)** ( b - k)
				resu = resu + temp
				k = k + 1
			resu = resu * 100
			resu = 100 - resu
			return combinaison(k, b)
		else:
			return False

	now = datetime.datetime.now()
	t = get_template('test.php')
	html = t.render(Context({
	'total': mafonction(a, b, c),
	}))
	return HttpResponse(html)


(c'est pour une page django)

je me retrouve avec un "resu" qui vaut toujours 100,0

quelqu'un peut il m'indiquer mon erreur ?

en vous remerciant d'avance

-Templier Nocturne

5 réponses

  1. Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
     
    Bonjour,
    k=c+1
    while k <= b:
    Ça fera toujours 100 si c, est supérieur ou égale à b, vu que la boucle ne fonctionnera pas on tombe directement sur
    resu = resu * 100
    resu = 100 - resu
    resu étant à zéro au départ
    100-0 = 100
    0
  2. heyquem Messages postés 808 Statut Membre 131
     
    Dans le lien , la sommation va de c à b, pas de c+1 à b. J'ai donc utilisé c et non pas c+1 dans le code qui suit.

    Tes deux fonctions peuvent être fondues en une seule moyennant l'utilisation d'un paramètre supplémentaire pour lequel il faudra passer un argument égal à 1 ou 2 selon ce qu'on veut en voir sortir.

    J'ai auusi réorganisé un peu le code et pris des raccourcis.

    Hxyp a raison, le programme ne sortia des résultats que si c n'est pas supérieur à b. A toi de réexaminer sur quelles valeurs tu utilises cette fonction

    def mafonction(a, b, c, choix): 
        if a != '' and b != '' and c != '': 
            a,b,c = map(int,(a,b,c)) 
            if choix==1: 
                return combinaison(k, b) 
            elif choix==2: 
                li = [] 
                for k in xrange(c,b+1): 
                    temp = combinaison(k, b) 
                    temp = temp * ((1 / a)**k) 
                    li.append(temp * (1 - 1/a)**( b - k)) 
                return round(100 - 100*sum(li) , 3) 
        else: 
            return False
    0
  3. Templier Nocturne Messages postés 9989 Statut Membre 1 107
     
    salut, désolé de répondre si tard, je m'attendais à recevoir un mail quand quelqu'un répondrait :/

    dans mes calculs, c est inférieur à b dans la plupart des cas, mais je trouve quand même 100
    0
  4. Templier Nocturne Messages postés 9989 Statut Membre 1 107
     
    non, toujours le même problème :/

    j'ai encore 100.0 :/

    (désolé de la réponse tardive, je pensais recevoir une notification par mail)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Templier Nocturne Messages postés 9989 Statut Membre 1 107
     
    en fait, il semblerait que si c = 0, le résultat passe à 0, mais soit 100 pour 'importe quelle autre valeur
    0