Générateurs de nombres pseudo aléatoires

Fermé
Hélou - 23 oct. 2015 à 08:17
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 - 9 nov. 2015 à 06:12
Bonjour,

J'essaie de programmer un générateur de nombres pseudo aléatoires.

1. graine=0
2. from random import *
3.
4. def change_graine(valeur):
5. global graine
6. graine=valeur
7. return
8.
9. change_graine(123456789)
10. print(graine)
11.
12. def aleatoire():
13. global graine
14. graine=((graine**2)//100000)%10000000000
15. return (graine)
16.
17. def flottant_aleatoire():
18. return (aleatoire()/1e10)
19.
20. def entier_aleatoire_entre_borne(a,b):
21. return (a+(aleatoire())%(b-a+1))
22.
23.
24. def teste_generateur(f,repet=20):
25. for i in range(0,repet):
26. print(f())
27.
28.
La fonction teste_generateur ne fonctionne pas quand je tape sur l'interpréteur python:
>>>teste_generateur(flottant_aleatoire(),20)
Il me répond:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Info\aléatoires.py", line 42, in teste_generateur
print(f())
TypeError: 'float' object is not callable
>>>
29.
31.
32. def cree_generateur(graine):
33. def aleatoire():
34. nonlocal graine
35. graine=((graine**2)//100000)%10000000000
36. return (graine)
37. return (aleatoire)
38.
39. def aleatoire2():
40. global graine
41. m=2**31
42. a=110351545
43. c=12345
44. graine=(graine*a+c)%m
45. return(graine)
46.
47. def flottant_aleatoire2():
48. return (aleatoire2()/1e10)
49.
50. def estime_pi(repet,alea):
51. oui=0
52. for i in range (repet):
53. r=alea() ** 2 + alea() ** 2
54. if r<=1:
55. oui+=1
56. return((oui/repet)*4)
Cette fonction a pour but de renvoyer une estimation de pi par la méthode de Monte Carlo (pour chaque répétition elle tire deux flottants aléatoires qu'on assimile à des coordonnées dans la carré [0;1[**2 puis on regarde si le point coorespondant est dans le disque unitaire. ON renvoie la proportion de points dans le disque multiplié par 4. )
J'ai testé cette fonction avec aleatoire(), avec aleatoire2() et avec random() ( après avoir fait from random import* ) mais cela ne fonctionne pas .
>>>
>>> estime_pi(20000,flottant_aleatoire())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\aléatoires.py", line 68, in estime_pi
r=alea() ** 2 + alea() ** 2
TypeError: 'float' object is not callable


Pouriez vous m'aider à prover les problemess'il vous plait ?

Merci d'avance
Coordialement
Hélou


PS : L'indentation n'apparait pas sur le message mais elle est bien présente dans mon programme python. (le forum l'enlève)
A voir également:

1 réponse

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
23 oct. 2015 à 08:58
Bonjour, le forum dispose d'un outil permettant d'afficher le code en couleur et indenté, avant de dire que ça ne marche pas, il faudrait se renseigner un peu.
J'aurais bien édité ton poste, mais cela implique de supprimer les numéros de lignes et je n'ai pas le temps.

Donc voir la coloration syntaxique ici pour poster un code.
Tu peux modifier ton postes toi même.
0
graine=0
from random import *

def change_graine(valeur):
    global graine
    graine=valeur
    return
    
change_graine(123456789)
print(graine)
    
def aleatoire():
    global graine
    graine=((graine**2)//100000)%10000000000
    return (graine)


def flottant_aleatoire():
    return (aleatoire()/1e10)


def entier_aleatoire_entre_borne(a,b):
    return (a+(aleatoire())%(b-a+1))

    
def teste_generateur(f,repet=20):
    for i in range(0,repet):
        print(f())


def cree_generateur(graine):
    def aleatoire():
        nonlocal graine
        graine=((graine**2)//100000)%10000000000
        return (graine)
    return (aleatoire)
    
def aleatoire2():
    global graine
    m=2**31
    a=110351545
    c=12345
    graine=(graine*a+c)%m
    return(graine)

def flottant_aleatoire2():
    return (aleatoire2()/1e10)
    
def estime_pi(repet,alea):
    oui=0
    for i in range (repet):
        r=alea() ** 2 + alea() ** 2
        if r<=1:
            oui+=1
    return((oui/repet)*4)
0
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27 > Hélou
9 nov. 2015 à 06:12
Bonjour Hélou,
plutôt que de répondre en donnant ton code, édite ton poste. C'est mieux pour les nouveaux arrivant sur le sujet. De plus, j'ai remarqué que ton code ne correspond pas aux erreurs donnée par l'interpréteur. Par exemple, il est écrit:
File "C:\Users\Info\aléatoires.py", line 42, in teste_generateur
print(f())
TypeError: 'float' object is not callable

or, à la ligne 42 du code que tu a donné il est écrit "a=110351545", ce qui n'a rien à voir avec l'erreur.
Donc pour récapituler, édite ton poste et fournis-nous des erreurs en corrélation avec le code. Et enfin, en passant, évite de manière générale l'utilisation du mot global.
Bon courage!
0