Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 19-07-2015 11:49:18

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Espérance

Bonjour, désolé si c'est une question bête mais je voulais être sur. pour un jeux video je me posais cette question:
pour 2599 altériums (monnaie du jeu) on a une chance sur 11 d'avoir une récompense spéciale.
je voulais savoir combien d'altérium falllait-il dépenser en moyenne pour avoir cette récompense spéciale donc en premier je me dit 2599*11= 28 589.
Cependant g ensuite fait un programme histoire de verifier/de m'entrainer un peu^^ :

from random import*
c=0
for i in range(0,100000):
    a=int(randint(1,11))
    while a!=1 :
        a=int(randint(1,11))

        c+=1
print(c/100000*2599)


je l'ai "lancé"(facon de parler) plusieurs foies et voila les résultats:

>>>
26065.500949999998
>>> ================================ RESTART ================================
>>>
26137.59721
>>> ================================ RESTART ================================
>>>
26044.65697
>>> ================================ RESTART ================================
>>>
25825.97711
>>> ================================ RESTART ================================
>>>
26030.51841
>>> ================================ RESTART ================================
>>>
25962.76248
>>>

J'en ai donc déduis que la réponse était 10*2599 soit 25 990

Donc j'aimerais savoir s'il y a une erreur ds mon programme ou non, et au final quel est la réponse et pourquoi ?(après plus ample réflexion, g fait un 2eme programme qui me donne bien 1/11 donc je penses vraiment que c'est ca la solution^^)

J'ai vérifié, le randint(1,11) va bien de 1 a 11...

Cordialement, Mr.Terces

Dernière modification par Terces (19-07-2015 12:25:41)

Hors ligne

#2 20-07-2015 13:37:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 404

Re : Espérance

Salut,


Personne ne se manifestant, je me lance...
Je ne comprends toujours pas ce que tu cherches à faire...
Une chance sur 11 te dit-on, donc en principe sur une série de 11 mises tu dois obtenir une fois en moyenne une récompense spéciale...
Je ne peux pas te dire ce qui cloche dans ton script, je ne vois pas ce que tu cherches à faire.

Disons que tu as une machine type Tirage du loto, avec 11 boules identiques mais numérotées de 1 à 11.
Tu procèdes à 11 tirages avec remise (c'est la machine modifiée qui s'en charge).
A chaque tirage, il y a équiprobabilité de sortie de chaque numéro : on peut donc décider arbitrairement d'un numéro gagnant sur les 11. qui t'apportera  ta récompense spéciale
Quelques remarques techniques sur ton script
1. from random import *... ok ! Pour quoi faire, alors que tu n'as besoin que de randint ?
   from random import randint marche aussi bien et bouffe moins de mémoire...
2.  a=int(randint(1,11)) ? Pourquoi le int ? alors qu'il figure déjà dans randint...
3. Puisque tu veux le lancer plusieurs fois, pourquoi n'encapsules-tu pas le tout dans une boucle supplémentaire ?

Je te propose ceci :

from random import randint

n=100000
for i in range(20):
    gain=0
    for c in range(n):
         for i in range(11):
             t=randint(1,11)
             if t==1:
                 gain+=1      
    print ("Récompense : 1 fois sur ","%2i" % int(n*11/gain))

J'enfonce une porte ouverte, hein...
Je recommence 20 fois une série de 100000 tirages de 11 numéros...
Je choisis le 1 comme gagnant :
t= randint(1,11)
if t==1:
    gain+=1

J'aurais pu faire plus court : gain+=(randint(1,11)==1)  --> vrai c'est 1, faux c'est 0
Lorsque ma série de 100000 tirages de 11 numéros est terminée, j'affiche le ratio n*11/gain et, sans surprise je tombe  sur 10 ou 11...
C'est pourquoi, j'ai dit que j'enfonçais une porte ouverte...
Pourquoi pas 11 systématiquement ?
freddy t'en causerait mieux que moi : probabilité n'est pas certitude...
Et il y aussi le fait que les générateurs aléatoires des langages de programmation ne sont que pseudo-aléatoires...
Celui de Python est bien placé...

@+

Hors ligne

#3 20-07-2015 14:14:38

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Espérance

yoshi a écrit :

Salut,


Personne ne se manifestant, je me lance...
Je ne comprends toujours pas ce que tu cherches à faire...
Une chance sur 11 te dit-on, donc en principe sur une série de 11 mises tu dois obtenir une fois en moyenne une récompense spéciale...
Je ne peux pas te dire ce qui cloche dans ton script, je ne vois pas ce que tu cherches à faire.

Disons que tu as une machine type Tirage du loto, avec 11 boules identiques mais numérotées de 1 à 11.
Tu procèdes à 11 tirages avec remise (c'est la machine modifiée qui s'en charge).
A chaque tirage, il y a équiprobabilité de sortie de chaque numéro : on peut donc décider arbitrairement d'un numéro gagnant sur les 11. qui t'apportera  ta récompense spéciale
Quelques remarques techniques sur ton script
1. from random import *... ok ! Pour quoi faire, alors que tu n'as besoin que de randint ?
   from random import randint marche aussi bien et bouffe moins de mémoire...
2.  a=int(randint(1,11)) ? Pourquoi le int ? alors qu'il figure déjà dans randint...
3. Puisque tu veux le lancer plusieurs fois, pourquoi n'encapsules-tu pas le tout dans une boucle supplémentaire ?

Je te propose ceci :

from random import randint

n=100000
for i in range(20):
    gain=0
    for c in range(n):
         for i in range(11):
             t=randint(1,11)
             if t==1:
                 gain+=1      
    print ("Récompense : 1 fois sur ","%2i" % int(n*11/gain))

J'enfonce une porte ouverte, hein...
Je recommence 20 fois une série de 100000 tirages de 11 numéros...
Je choisis le 1 comme gagnant :
t= randint(1,11)
if t==1:
    gain+=1

J'aurais pu faire plus court : gain+=(randint(1,11)==1)  --> vrai c'est 1, faux c'est 0
Lorsque ma série de 100000 tirages de 11 numéros est terminée, j'affiche le ratio n*11/gain et, sans surprise je tombe  sur 10 ou 11...
C'est pourquoi, j'ai dit que j'enfonçais une porte ouverte...
Pourquoi pas 11 systématiquement ?
freddy t'en causerait mieux que moi : probabilité n'est pas certitude...
Et il y aussi le fait que les générateurs aléatoires des langages de programmation ne sont que pseudo-aléatoires...
Celui de Python est bien placé...

@+

Salut, la réponse en elle même est très simple mais "à cause" du programme que j'ai fait, cela m'avais fait douté (je ne sais toujours pas ce qui ne va pas dans mon programme mais bon ca ne m’empêchera pas pour le moment de dormir).
Sinon, je sais que je ne suis pas un pro de python:
*je l'ai lancé plusieurs fois comme ca^^ mais ce n'etait pas forcément a rajouter au programme car pas voulu...
* le "from random import*" à la place de "from random import randint" c'est juste que je ne fais pas de gros programmes donc pas de problemes sur ce point et puis c'est plus court a écrire dc par "sélection" g rapidement adopté la 1ere option.
*pour le int() c un mauvais reflexe^^

PS: tu sais, il y a int(), float(), str() et je me souviens que j'en connaissais un autre qui etait tres utile mais je ne me souviens plus de ce que c'est ni pourquoi il est utile donc si tu vois de quoi je veux parler j'aimerais bien que tu me le dise ;)

à+

Hors ligne

#4 20-07-2015 14:38:26

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 404

Re : Espérance

salut,

Déjà str, c'est pour transformer un nombre en chaîne (string), donc à ne pas mélanger avec int et float...
Dans le module maths, il y a encore floor().
Sur des nombres positifs, pas de différence avec int(), mais ce n'est pas le cas avec des négatifs, essaie...
Tu as encore round()

c'est juste que je ne fais pas de gros programmes

Prépare donc l'avenir : l'appétit vient en mangeant...

Et si tu me disais ce que tu cherches à faire dans le script que tu as montré -pourquoi laisser tomber ? Au contraire, la question de savoir pourquoi le prog ne donne pas ce que tu veux, est intéressante) ? et si tu montrais le 2nd qu'on compare ?

Question hors-sujet : à quoi te sert de "quoter" systématiquement la totalité d'une réponse ?
Le "quote" est par contre très utile lorsqu(on veut répondre à des morceaux de phrase...

Tiens, pour finir, tu t'es intéressé au binaire, je te suggère sur une autre façon d'écrire les (grands) nombres : le code CLE.
Sujet traité ici :
http://www.bibmath.net/forums/viewtopic.php?id=5011
puis là :
http://www.bibmath.net/forums/viewtopic.php?id=7077

@+

Hors ligne

#5 20-07-2015 15:47:34

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Espérance

yoshi a écrit :

salut,
Et si tu me disais ce que tu cherches à faire dans le script que tu as montré -pourquoi laisser tomber ? Au contraire, la question de savoir pourquoi le prog ne donne pas ce que tu veux, est intéressante) ? et si tu montrais le 2nd qu'on compare ?

Re,
en fait le 2eme programme ne fonctionne pas du tout comme le premier:

#1er programme
print('premier programme')
     
from random import*
c=0
for i in range(0,100000):
    a=int(randint(1,11))
    while a!=1 :
        a=int(randint(1,11))

        c+=1
print(c/100000*2599)


#2eme programme
print('\n\ndeuxième programme')

from math import*
s=0
for i in range(1,10000):
    s+=(10/11)**(i-1)*(1/11)*2599*i
print(s)

--------------------------------------Les  résultats----------------------------------------

>>>
premier programme
26006.555630000003


deuxième programme
28588.99999999994
>>>

--------------------------------------Les  explications-------------------------------------

Pour le premier, j’achète ce pack a 2599 altériums jusqu'à que j'ai mon "cadeau voulu" soit le chiffre 1(sur 11) et je regarde le prix que ca m'a couté. Je fais ceci 100 000 de fois afin de faire la moyenne et d'avoir une idée assez précise de combien ca me coute en moyenne. La ou il y a le souci c'est que ca me donne en gros 26 000 altériums soit 10fois le prix de base alors que ce n'est pas une chance sur 10 mais une chance sur 11.
Et comme dit précedemment, j'ai vérifié, randint(1,11) va bien de 1 à 11.

Pour le 2eme, la proba que je l'ai du 1er coup multiplié par le prix que ca représente + la preoba que je l'ai du 2eme coup et le prix que ca représente et ceci jusqu'à la proba que je l'ai au 100 000 (donc quasiment 0) coup et le prix que ca représente.



PS: je crois que c'est bon je sais peut-etre ce qui ne va pas, quand le while!=1 se fini l'algorithme ne rajoute donc pas 1 à c, ce qui fait que le résultat est faussé, j'ai rajouter c+=1 au debut de la "boucle" pour i allant de 1 à 100 000 et cela me donne le résultat attendu.

PS2: voila j'ai enfin retrouvé la fonction que je cherchais, c'est "eval" :) merci quand même ^^

Dernière modification par Terces (20-07-2015 19:49:27)

Hors ligne

Pied de page des forums