U e5d‚pã@sddlmZddlmZmZmZ m Z m Z ddlmZmZmZmZddlmZddlmZmZddlmZ m!Z"ddl#m#Z$ddlZ%zdd l&m'Z&Wn e(k r°dd l)m'Z&YnXd d d d ddddddddddddddddddd d!gZ*d"ed#ƒed$ƒZ+d$e Z,ed%ƒZ-d&ed'ƒZ.d(Z/d)e/ Z0ddl1Z1Gd*d „d e1j2ƒZ2Gd+d!„d!e2ƒZ3d,d-„Z4d4d/d0„Z5e2ƒZ6e6j7Z7e6j8Z8e6j9Z9e6j:Z:e6j;Z;e6jZ>e6j?Z?e6j@Z@e6jAZAe6jBZBe6jCZCe6jDZDe6jEZEe6jFZFe6jGZGe6jHZHe6jIZIe6jJZJe6jKZKe6jLZLeMe%d1ƒ�re%jNe6j7d2�eOd3k�re5ƒdS)5é)Úwarn)ÚlogÚexpÚpiÚeÚceil)ÚsqrtÚacosÚcosÚsin)Úurandom)ÚSetÚSequence)Ú accumulateÚrepeat)ÚbisectN)Úsha512ÚRandomÚseedÚrandomÚuniformÚrandintÚchoiceÚsampleÚ randrangeÚshuffleÚ normalvariateÚlognormvariateÚ expovariateÚvonmisesvariateÚ gammavariateÚ triangularÚgaussÚ betavariateÚ paretovariateÚweibullvariateÚgetstateÚsetstateÚ getrandbitsÚchoicesÚ SystemRandomégà¿ç@ç@çð?ç@é5écs eZdZdZd>dd„Zdd„Zd?‡fdd „ Z‡fd d „Z‡fd d „Zdd„Z dd„Z dd„Z dde fdd„Z dd„Zdd„Ze de>fdd„ZeZdd„Zd@dd „Zd!d"„ZdAddd#œd$d%„Zd&d'„ZdBd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Z d}d|jkrqFd|jkr.|j|_qFd|jkr|j|_qFqdS)NÚ _randbelowr(r)Ú__mro__Ú__dict__Ú_randbelow_with_getrandbitsr:Ú_randbelow_without_getrandbits)ÚclsÚkwargsÚcr7r7r8Ú__init_subclass__gs    zRandom.__init_subclass__r1csÞ|dkr‚t|ttfƒr‚t|tƒr*| d¡n|}|rBt|dƒd>nd}tt|ƒD]}d||Ad@}qP|t|ƒN}|dkr~dn|}|d krÈt|tttfƒrÈt|tƒr¬| ¡}|t |ƒ  ¡7}t   |d ¡}t ƒ |¡d|_dS) Nézlatin-1réiCBlÿÿÿÿéÿÿÿÿéþÿÿÿr1Úbig)Ú isinstanceÚstrÚbytesÚdecodeÚordÚmapÚlenÚ bytearrayÚencodeÚ_sha512ZdigestÚintÚ from_bytesÚsuperrr4)r5ÚaÚversionr6rA©Ú __class__r7r8r{s    z Random.seedcs|jtƒ ¡|jfSr3)ÚVERSIONrTr&r4©r5rWr7r8r&›szRandom.getstatec s¢|d}|dkr*|\}}|_tƒ |¡nt|dkrŒ|\}}|_ztdd„|Dƒƒ}Wn(tk r|}z t|‚W5d}~XYnXtƒ |¡ntd||jfƒ‚dS)Nrr2r1css|]}|dVqdS)lNr7)Ú.0r6r7r7r8Ú ¬sz"Random.setstate..z?state with version %s passed to Random.setstate() of version %s)r4rTr'ÚtupleÚ ValueErrorÚ TypeErrorrY)r5ÚstaterVZ internalstaterrWr7r8r'Ÿs  þzRandom.setstatecCs| ¡Sr3)r&rZr7r7r8Ú __getstate__½szRandom.__getstate__cCs| |¡dSr3)r')r5r`r7r7r8Ú __setstate__ÀszRandom.__setstate__cCs|jd| ¡fS)Nr7)rXr&rZr7r7r8Ú __reduce__ÃszRandom.__reduce__rCc Cs||ƒ}||krtdƒ‚|dkr:|dkr2| |¡Stdƒ‚||ƒ}||krRtdƒ‚||}|dkrx|dkrx|| |¡S|dkr’td|||fƒ‚||ƒ}||krªtdƒ‚|dkrÄ||d|} n"|dkrÞ||d|} ntdƒ‚| dkrötdƒ‚||| | ¡S) Nz!non-integer arg 1 for randrange()rzempty range for randrange()z non-integer stop for randrange()rCz(empty range for randrange() (%d, %d, %d)z non-integer step for randrange()zzero step for randrange())r^r:) r5ÚstartÚstopÚstepÚ_intZistartZistopÚwidthZistepÚnr7r7r8rÈs4  zRandom.randrangecCs| ||d¡S©NrC)r©r5rUÚbr7r7r8rôszRandom.randintcCs,|j}| ¡}||ƒ}||kr(||ƒ}q|Sr3)r(Ú bit_length)r5rir(ÚkÚrr7r7r8r=ús  z"Random._randbelow_with_getrandbitscCsn|j}||kr$tdƒ||ƒ|ƒS|dkr4tdƒ‚||}|||}|ƒ}||kr^|ƒ}qN|||ƒ|S)Nz¤Underlying random() generator does not supply enough bits to choose from a population range this large. To remove the range limitation, add a getrandbits() method.rzBoundary cannot be zero)rÚ_warnr^)r5rirRÚmaxsizerZremÚlimitror7r7r8r>s z%Random._randbelow_without_getrandbitscCs:z| t|ƒ¡}Wntk r0tdƒd‚YnX||S)Nz$Cannot choose from an empty sequence)r:rNr^Ú IndexError)r5ÚseqÚir7r7r8rs z Random.choicecCsš|dkrN|j}ttdt|ƒƒƒD]*}||dƒ}||||||<||<q nHt}ttdt|ƒƒƒD]0}||ƒ|dƒ}||||||<||<qddSrj)r:ÚreversedÚrangerNrR)r5r6rÚ randbelowruÚjrgr7r7r8r%s  zRandom.shufflec Cst|tƒrt|ƒ}t|tƒs$tdƒ‚|j}t|ƒ}d|krF|ksPntdƒ‚dg|}d}|dkr€|dtt |ddƒƒ7}||krÌt |ƒ}t |ƒD]0}|||ƒ} || ||<|||d|| <q˜nHt ƒ} | j } t |ƒD]2}||ƒ} | | krþ||ƒ} qì| | ƒ|| ||<qà|S) Nz>Population must be a sequence or set. For dicts, use list(d).rz,Sample larger than population or is negativeéér+r2rC)rHÚ_Setr]Ú _Sequencer_r:rNr^Ú_ceilÚ_logÚlistrwÚsetÚadd) r5Ú populationrnrxriÚresultZsetsizeZpoolruryZselectedZ selected_addr7r7r8r;s6)        z Random.sample)Ú cum_weightsrncs´|j‰tˆƒ‰ˆdkrV|dkrHt‰ˆd7‰‡‡‡‡fdd„td|ƒDƒStt|ƒƒ‰n|dk rftdƒ‚tˆƒˆkrztdƒ‚t‰ˆdd‰ˆd‰‡‡‡‡‡‡fdd„td|ƒDƒS) Nçcsg|]}ˆˆˆƒˆƒ‘qSr7r7©r[ru)rgrirƒrr7r8Ú �sz"Random.choices..z2Cannot specify both weights and cumulative weightsz3The number of weights does not match the populationrErCcs$g|]}ˆˆˆˆƒˆdˆƒ‘qS)rr7r‡)rr…ÚhirƒrÚtotalr7r8rˆ˜sÿ) rrNrRÚ_repeatr€Ú _accumulater_r^Ú_bisect)r5rƒZweightsr…rnr7)rgrr…r‰rirƒrrŠr8r)‚s$  ÿzRandom.choicescCs|||| ¡Sr3©rrkr7r7r8rŸszRandom.uniformr†r.cCs|| ¡}z |dkrdn||||}Wntk r@|YSX||krdd|}d|}||}}|||t||ƒS)Nçà?r.)rÚZeroDivisionErrorÚ_sqrt)r5ZlowZhighÚmodeÚurAr7r7r8r!¥s    zRandom.triangularcCsP|j}|ƒ}d|ƒ}t|d|}||d}|t|ƒ krqDq|||S)Nr.r�r-)rÚ NV_MAGICCONSTr)r5ÚmuÚsigmarÚu1Úu2ÚzZzzr7r7r8r»s   zRandom.normalvariatecCst| ||¡ƒSr3)Ú_expr)r5r•r–r7r7r8rÔszRandom.lognormvariatecCstd| ¡ƒ |S©Nr.)rr)r5Zlambdr7r7r8ràszRandom.expovariatecCsÐ|j}|dkrt|ƒSd|}|td||ƒ}|ƒ}tt|ƒ}|||}|ƒ} | d||ks€| d|t|ƒkr4q€q4d|} | |d| |} |ƒ} | dkr¼|t| ƒt} n|t| ƒt} | S)Ng�íµ ÷ư>r�r.)rÚTWOPIr‘Ú_cosÚ_piršÚ_acos)r5r•ZkapparÚsror—r™Údr˜ÚqÚfZu3Zthetar7r7r8rós$   $zRandom.vonmisesvariatecCs~|dks|dkrtdƒ‚|j}|dkrÖtd|dƒ}|t}||}|ƒ}d|kr`dksdqFqFd|ƒ}t|d|ƒ|} |t| ƒ} |||} ||| | } | td| dksÊ| t| ƒkrF| |SqFn¤|dkròtd|ƒƒ |S|ƒ} t|t}|| }|dk�r$|d|} nt|||ƒ } |ƒ}|dk�r^|| |dk�rp�qrqò|t| ƒkrò�qrqò| |SdS)Nr†z*gammavariate: alpha and beta must be > 0.0r.r,gH¯¼šò×z>gËPÊÿÿï?r/)r^rr‘ÚLOG4rršÚ SG_MAGICCONSTÚ_e)r5ÚalphaÚbetarZainvZbbbZcccr—r˜Úvr6r™ror“rlÚpr7r7r8r #s@        zRandom.gammavariatecCs`|j}|j}d|_|dkrT|ƒt}tdtd|ƒƒƒ}t|ƒ|}t|ƒ||_|||S)NgÀr.)rr4rœr‘rr�Ú_sin)r5r•r–rr™Zx2piZg2radr7r7r8r"hs  z Random.gausscCs0| |d¡}|dkrdS||| |d¡SdS)Nr.rr†)r )r5r§r¨Úyr7r7r8r#�s zRandom.betavariatecCsd| ¡}d|d|Sr›rŽ)r5r§r“r7r7r8r$¯s zRandom.paretovariatecCs"d| ¡}|t|ƒ d|Sr›)rr)r5r§r¨r“r7r7r8r%¸s zRandom.weibullvariate)N)Nr1)N)N)r†r.N)#Ú__name__Ú __module__Ú __qualname__rYr9rBrr&r'rarbrcrRrrr=ÚBPFr>r:rrrr)rr!rrrrr r"r#r$r%Ú __classcell__r7r7rWr8rNs:   ,  G  0E5 c@s4eZdZdd„Zdd„Zdd„Zdd„ZeZZd S) r*cCst tdƒd¡d?tS)NrDrGr2)rRrSÚ_urandomÚ RECIP_BPFrZr7r7r8rÍszSystemRandom.randomcCs<|dkrtdƒ‚|dd}t t|ƒd¡}||d|?S)Nrz(number of bits must be greater than zerorDérG)r^rRrSr²)r5rnZnumbytesr6r7r7r8r(Ñs  zSystemRandom.getrandbitscOsdSr3r7©r5ÚargsÚkwdsr7r7r8rÙszSystemRandom.seedcOs tdƒ‚dS)Nz*System entropy source does not have state.)ÚNotImplementedErrorrµr7r7r8Ú_notimplementedÝszSystemRandom._notimplementedN) r­r®r¯rr(rr¹r&r'r7r7r7r8r*Ås cCsÀddl}t|d|jƒd}d}d}d}| ¡}t|ƒD]4} ||Ž} || 7}|| | }t| |ƒ}t| |ƒ}q6| ¡} tt| |dƒddd �||} t||| | ƒ} td | | ||fƒdS) NrÚtimesr†g _ Bg _ Âr2zsec,ú )Úendz"avg %g, stddev %g, min %g, max %g ) ÚtimeÚprintr­Ú perf_counterrwÚminÚmaxÚroundr‘)riÚfuncr¶r½rŠZsqsumZsmallestZlargestZt0rur6Út1ZavgZstddevr7r7r8Ú_test_generatoräs(     ÿrÅéÐcCsÄt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|tdƒt|td ƒt|td ƒt|td ƒt|tdƒt|td ƒt|td ƒdS)Nr7)r†r.)g{®Gáz„?r.)çš™™™™™¹?r.)rÇr,)r�r.)gÍÌÌÌÌÌì?r.)r.r.)r,r.)g4@r.)gi@r.)ç@rÈ)r†r.gUUUUUUÕ?) rÅrrrrr r"r#r!)ÚNr7r7r8Ú_testús                rÊÚfork)Zafter_in_childÚ__main__)rÆ)PÚwarningsrrpZmathrrrršrržrr¦rr~rr‘r rŸr r�r r«Úosr r²Ú_collections_abcr r|rr}Ú itertoolsrrŒrr‹rr�Ú_osrQrÚ ImportErrorZhashlibÚ__all__r”rœr¤r¥r°r³Z_randomrr*rÅrÊZ_instrrrr!rrrrrr)rrrrr r"r#r$r%r&r'r(ÚhasattrÚregister_at_forkr­r7r7r7r8Ú(s�   û  {