IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

random. Changement de state


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut random. Changement de state
    Bonsoir,

    A-t'on la garantie que tout appel à une fonction de génération de nombre aléatoire change l'état renvoyé par getstate() ?

    Une idée de la probabilité de retomber sur le même state après un certain nombre d'appel à random()

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    getstate() renvoie l'état du générateur.

    Et le générateur utilise le "Mersenne Twister" (https://fr.wikipedia.org/wiki/Mersenne_Twister) pour générer des nombres flottants de 53bits et une période de 2**19937-1 soit un entier de 6001 chiffres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    periode = "431542479738816264805523551633791983905393504322671150516525054140\
    33306801376580911304513629318584665545269938257648835317902217334584413909528\
    26915460916801900787534374139629680192011448648090266141431844327698030006672\
    81049840954515881760771329698437621346217903963913412852056276196005131066463\
    76648615994236675486537480241964350295935168662363909047948347692313978301377\
    82078571241905447433284452918317297324231088826508132162646945107770781228282\
    94447750226804880578200287646593991647662652009005614958003440543536903898628\
    94061792872011120833614808447482913547328367277879565648307846909116945866230\
    16970240126024018702874665003344577457031543129299602518778079011937590286317\
    10841496424733789862675033089613749057663409052895722900160380005716308751913\
    73979555047468154333253474991046248132504516341796551470575481459200859472614\
    83621387555711686444578975088627799648730430845048422342062926651855602433933\
    91908443689210184248446770427276646018529149252772809226975384267702573339289\
    54401205465895610347658855386633902546289962132643282425748035786233580608154\
    69654693256383332767076989943977488852668727852745100296305914696387571542573\
    55344759797344631006783673933274021499309687782967413915145996023742136298987\
    20611431410402147238998090962818915890645693934483330994169632295877995848993\
    36674701487176349480554999616305154122540346529700772114623135570408149309866\
    30657336771911728539870957481678162560842128233801686253345864312540346708061\
    35273543270714478876861861983320777280644806691125713197262581763151313596429\
    54776357636783701934983517846214429496075719091805462511414366638418943385257\
    64522893476524546315357404687862289458856546085620580424689873724369214450923\
    15377698407168198376538237748614196207041548106379365123192817999006621766467\
    16711347163271548179587700538269439340040306170045769113534918787488892342934\
    93401451705717161811257958888892774954269771499145496239163940148229850253316\
    51511431278802009056808456506818877266609831636883884905621822262933986548645\
    66908067219170474040889134983568566242806323119852043682632941529075297279834\
    34294465099922063687813671540917026557727273913294242775293490826005858847665\
    23150957417077831910016168475685658673192860882070179760307269849987354836042\
    37173466025769434723550630174411887414129243895814154910060975221688223088761\
    14319964723308423801371109274494835578150375868496445857499177728699267442183\
    69621137675101083278543794081749094091043084096774144708436324279476892056200\
    42722796163866914980548983112124467639993195537148401288636074870647956866904\
    85747828552170547401139459296221775025755658110674522014489819919686359653615\
    51681273982740760138899638820318776303668762730157584640042798880691862640268\
    61268618088387493957381812502227968993026744625577395954246983163786300017127\
    92271514060341299021815706596505326007758236773981821290873944498591827499990\
    07223592423334567850671186568839186747704960016277540625331440619019129983789\
    91471251536520033605799350860167880768756856237785709525554130490292719222018\
    41725023571244499118702106426945650613849193734743245039662677990384023867816\
    86809962015879090586549423504699190743519551043722544515740967829084336025938\
    22578073088027385526155197204407562032678062444880349099823216123168779471561\
    34057932495455095280525180101230872587789741158170482455889714385967544080813\
    13438375502988726739523375296641615501406091607983229239827240614783252892479\
    71651993698951918780868122119164174771090248063349109170482744122828118663244\
    59071457871383512348422613800746219140048181523866660431333448750679035828382\
    83562688083236575482068479639546383819532174522502682372441363275765875609119\
    78365329831206670821714931677356434037928972439398674413989185541661229573935\
    66686126582712346964383771228389980401997390780614436754156710784634046737024\
    03777653478173367084844734702056866636158138003692253382209909466469591930161\
    62609792050874217567030650513954286075080615983535754103214709508427846105670\
    13677397949320242029987077310176925820462107022125141204293225304317896162670\
    47776115123597935404147084870985465426502772057300900333847905334250604119503\
    03000170400288789294140460334586992636750135509494275055259158163998052319067\
    96107849935808966832992976812624423140086570334218680945517405064488290392073\
    16711307695131892296593509018623094810557519560305240787163809219164433754514\
    86330100091591698585624217656362477132898167854824629737624953025136036341276\
    83664561750770319774575349128064331765399959943433081184701471587128161493944\
    21276614228262909950055746981053206610001560295784656616193252269412026831159\
    50894967151384519588321714798274887926185141781997903441728559860772722086667\
    76804260903087548238033454465663056192413083744527546681430154877108777280110\
    86004325892262259413968285283497045571062757701421761565262725153407407625405\
    14993198949445910641466053430537857670986252004986488096114486925860347371436\
    36591940139627063668513892996928694918051725568185082988249549548157960631695\
    17658741420159798754273428026723452481263569157307213153739781041627653715078\
    59850415479728766312294671134815852941881643282504446669278113747449489838506\
    43757875073764963451486253063833915551456900878919553159944629444932352488175\
    99907119135755933382121706191477185054936632211157222920331148502487563303118\
    01880568507356984158051811871077865395357129601437294086527040702192438316729\
    03232315679122894194862405940390744523216780193818712190921554607684445735785\
    59513613304242206151356457513937270939009707237827101245853837678338161023397\
    58685489423069609154024998790745346131192396385295075475805820562595660081774\
    30071917468126559550217476709224608667477445208756078590623347506270983285934\
    80067789456169602494392813763495657599847485773553990957557313200809040830036\
    44649221940993409694873054749430121616568675073574955588234030398987467297545\
    50609577369215591954808155140359157071299300570271172862528431974133123076178\
    86797506784260195436760305990340708481464607278955495487742140753570621217198\
    25219297886978691673462561843017545490386411158542950456992090563674153903096\
    8041471"
    Si ça ne suffit pas (!), on peut toujours sous-classer random et utiliser un générateur de nombres pseudo-aléatoire encore plus solide.

    Pour la cryptographie, par exemple, l'algorithme de "Blum Blum Shub" (https://fr.wikipedia.org/wiki/Blum_Blum_Shub) est (relativement) assez facile à programmer et peut utiliser des nombres premiers aussi grands qu'on veut (plusieurs centaines de chiffres), afin qu'il soit quasi impossible de deviner la séquence. En contrepartie, il est moins rapide.

    A noter que pour éviter de retrouver la même séquence aléatoire à chaque fois qu'on lance un programme, il faut utiliser random.seed().

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par VV33D Voir le message
    Une idée de la probabilité de retomber sur le même state après un certain nombre d'appel à random()
    Je dois vous avouer que je ne comprends pas trop ce que vous cherchez a faire.
    .state et .seed identiques sont les seuls biais utilisables pour reproduire une même séquence de nombres aléatoires. C'est une fonctionnalité intéressante pour certains tests genre performance.
    En dehors de ce cas particulier, ce seront les propriétés (distribution, répétitions,...) de la séquence de nombres générés qui est intéressante. Savoir "comment" Python s'en débrouille est largement documente.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Merci à tous les deux pour vos réponses.

    Je dois vous avouer que je ne comprends pas trop ce que vous cherchez a faire.
    Je cherche à vérifier qu'une instance random.Random(), instanciée à l'import, n'a pas été utilisée avant de recevoir une seed depuis un réseau. Je pensais stocker dans un attribut le state initial et vérifier dans une méhode seed surchargée que l'état était toujours l'état initial.

    Il semble plus safe d'opter pour une solution basée sur les méthodes plutôt que sur l'état (tracker les appels à la méthode random() pour interdire seed())

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Je cherche à vérifier qu'une instance random.Random(), instanciée à l'import, n'a pas été utilisée avant de recevoir une seed depuis un réseau.
    En Python, difficile d'interdire!
    Pourquoi ne pas s/classer Random pour qu'il récupère son seed depuis le réseau? Vous pouvez, de plus, changer le seed "plus tard"...

    Vous pouvez éventuellement regarder ce que retourne .getstate.
    C'est un tuple a 3 items.
    Le 2nd contient la valeur des 624 entrées de la table du MT qui permet de générer le nombre aléatoire et se termine par l'index de l’entrée courante. Il est initialise a 624.
    Ca peut donner une indication, comme on pourra toujours truander... je préfère la s/classe et des utilisateurs "responsables" (pas d'autres choix avec Python).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    difficile d'interdire!
    Disons vérifier alors
    je préfère la s/classe et des utilisateurs "responsables"
    Oui, ça évite de dépendre de l’implémentation du générateur. Cela dit j'en dépends toujours dans la mesure ou je ne vérifie que la méthode random(), la doc spécifiant
    Almost all module functions depend on the basic function random()
    Vous pouvez, de plus, changer le seed "plus tard"
    C'est ce que je fais (en consequence d'un message réseau traité par une eventloop). A ce sujet, quelle garantie ais-je que 2 clients différents engendrent la même séquence à partir d'une même seed (os et versions Python différentes) ?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    C'est ce que je fais (en consequence d'un message réseau traité par une eventloop). A ce sujet, quelle garantie ais-je que 2 clients différents engendrent la même séquence à partir d'une même seed (os et versions Python différentes) ?
    Par défaut, le seed est un long construit a partir de "time(&now)". Si le tableau du MT est construit avec le même "seed", random() générera la même séquence de nombres "aléatoires".
    Quelque soit l'OS et la version de Python, l'algo (MT) ne changeant pas, un même seed devrait sortir la même suite aux détails implémentation près qui se testent "a la marge".

    Mais je ne comprends toujours pas l’intérêt de vouloir fabriquer des suites de nombres aléatoires identiques pour une application distribuée.
    note: ce que je veux dire, c'est qu'utiliser random (ou n'importe quelle autre fonctionnalité) en dehors des clous est soit "génial", soit un gros défaut de conception...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Changement de states
    Par gunsailor dans le forum MXML
    Réponses: 3
    Dernier message: 18/12/2012, 13h12
  2. Changement d'états avec case - State machine VHDL
    Par Azerty32 dans le forum VHDL
    Réponses: 2
    Dernier message: 25/05/2012, 14h22
  3. Changement de langue dynamique (D6 et outils de traduction)
    Par agon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2002, 16h15
  4. Random en Assembleur
    Par funx dans le forum Assembleur
    Réponses: 9
    Dernier message: 02/09/2002, 17h05
  5. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo