[python] application d'une formule de proba

Fermé
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 - 18 avril 2011 à 21:13
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 - 22 avril 2011 à 23:22
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
A voir également:

5 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
19 avril 2011 à 11:59
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 20/04/2011 à 01:58
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
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 101
22 avril 2011 à 22:36
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
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 101
22 avril 2011 à 23:03
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

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

Posez votre question
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 101
22 avril 2011 à 23:22
en fait, il semblerait que si c = 0, le résultat passe à 0, mais soit 100 pour 'importe quelle autre valeur
0