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.
Version imprimable
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.
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:
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.Code:
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"
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().
Salut,
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
Merci à tous les deux pour vos réponses.
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.Citation:
Je dois vous avouer que je ne comprends pas trop ce que vous cherchez a faire.
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())
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
Disons vérifier alorsCitation:
difficile d'interdire!
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écifiantCitation:
je préfère la s/classe et des utilisateurs "responsables"
Citation:
Almost all module functions depend on the basic function random()
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) ?Citation:
Vous pouvez, de plus, changer le seed "plus tard"
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".Citation:
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) ?
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
Merci pour les infos Wiztricks !
Un jeu vidéo qui génère aléatoirement un univers et aimerait bien que cet univers soit le même chez tout les joueurs.Citation:
l’intérêt de vouloir fabriquer des suites de nombres aléatoires identiques pour une application distribuée
Simplifions le problème: La configuration initiale d'une partie est une matrice de cases (générée aléatoirement). Pour synchroniser les clients, je peux m'amuser à envoyer tous les messages <set(i,j,quelquechose)>, mais que de travail/occupation réseau/temps traitement inutile si je peux assurer la synchronisation initiale via une simple seed
...Espérons que ça rentre dans la 1ere catégorie