o
     JAfŁ                     @   s  	 d dl mZ d dlmZmZmZ	m
ZmZ d dlmZmZmZmZ d dlmZmZmZ d dlmZ d dlm Z!m"Z# d dl$m%Z& d dl'm(Z)m*Z+ d d	l,m,Z- d d
lZ.d d
l/Z/zd dl0m1Z0 W n e2yl   d dl3m1Z0 Y nw g dZ4ded ed Z5edZ6ded Z7dZ8de8  Z9dZ:G dd de/j;Z;G dd de;Z<e; Z=e=j>Z>e=j?Z?e=j@Z@e=jAZAe=jBZBe=jCZCe=jDZDe=jEZEe=jFZFe=jGZGe=jHZHe=jIZIe=jJZJe=jKZKe=jLZLe=jMZMe=jNZNe=jOZOe=jPZPe=jQZQe=jRZRe=jSZSe=jTZTdd ZUd"ddZVeWe.dre.jXe=j>d  eYd!kreV  d
S d
S )#    )warn)logexppieceil)sqrtacoscossin)taufloorisfinite)urandom)SetSequence)index)
accumulaterepeat)bisectN)sha512)RandomSystemRandombetavariatechoicechoicesexpovariategammavariategaussgetrandbitsgetstatelognormvariatenormalvariateparetovariate	randbytesrandintrandom	randrangesampleseedsetstateshuffle
triangularuniformvonmisesvariateweibullvariate   g             @      @      ?      @5         c                       s,  e Zd Z	 dZdAddZdB fdd	Z fdd	Z fd
dZdd Zdd Z	dd Z
dd Zdd Zde> fddZeZdd ZdefddZdd Zdd  ZdAd!d"Zdd#d$d%ZdAddd&d'd(Zd)d* ZdCd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"  Z#S )Dr      Nc                 C   s   	 |  | d | _d S N)r)   
gauss_next)selfx r=   /usr/lib/python3.10/random.py__init__w   s   

zRandom.__init__r6   c                    s  	 |dkrCt |ttfrCt |tr|dn|}|r"t|d d> nd}tt|D ]
}d| |A d@ }q)|t|N }|dkr@dn|}n5|d	kret |tttfret |trX| }t	
|t|  d
}nt |td t	ttttfsxtdtd	 t | d | _d S )Nr7   zlatin-1r      iCB l    r6   bigzSeeding based on hashing is deprecated
since Python 3.9 and will be removed in a subsequent version. The only 
supported seed types are: None, int, float, str, bytes, and bytearray.)
isinstancestrbytesdecodeordmaplen	bytearrayencodeint
from_bytes_sha512digesttypefloat_warnDeprecationWarningsuperr)   r:   )r;   aversionr<   c	__class__r=   r>   r)      s$   

zRandom.seedc                    s   	 | j t  | jfS r9   )VERSIONrU   r    r:   r;   rY   r=   r>   r          zRandom.getstatec              
      s   	 |d }|dkr|\}}| _ t | d S |dkrD|\}}| _ ztdd |D }W n ty; } zt|d }~ww t | d S td|| jf )Nr   r8   r6   c                 s   s    | ]}|d  V  qdS )l        Nr=   ).0r<   r=   r=   r>   	<genexpr>   s    z"Random.setstate.<locals>.<genexpr>z?state with version %s passed to Random.setstate() of version %s)r:   rU   r*   tuple
ValueError	TypeErrorr[   )r;   staterW   internalstater   rY   r=   r>   r*      s"   zRandom.setstatec                 C   s   |   S r9   )r    r\   r=   r=   r>   __getstate__   s   zRandom.__getstate__c                 C   s   |  | d S r9   )r*   )r;   rc   r=   r=   r>   __setstate__   s   zRandom.__setstate__c                 C   s   | j d|  fS )Nr=   )rZ   r    r\   r=   r=   r>   
__reduce__   s   zRandom.__reduce__c                K   sR   	 | j D ]"}d|jv r d S d|jv r| j| _ d S d|jv r&| j| _ d S qd S )N
_randbelowr   r&   )__mro____dict___randbelow_with_getrandbitsrh   _randbelow_without_getrandbits)clskwargsrX   r=   r=   r>   __init_subclass__   s   



zRandom.__init_subclass__c                 C   s<   	 |sdS | j }| }||}||kr||}||ks|S )Nr   )r   
bit_length)r;   nr   krr=   r=   r>   rk      s   z"Random._randbelow_with_getrandbitsr7   c                 C   sr   	 | j }||krtd t| | S |dkrdS || }|| | }| }||kr1| }||ks*t|| | S )NzUnderlying random() generator does not supply 
enough bits to choose from a population range this large.
To remove the range limitation, add a getrandbits() method.r   )r&   rS   _floor)r;   rq   maxsizer&   remlimitrs   r=   r=   r>   rl      s   z%Random._randbelow_without_getrandbitsc                 C   s   	 |  |d |dS )N   little)r   to_bytesr;   rq   r=   r=   r>   r$     s   zRandom.randbytesc           	      C   s  	 zt |}W n! ty(   t|}||kr tdtd tdtdtd Y nw |d u rB|tur5td|dkr>| |S tdzt |}W n! tyi   t|}||kratdtd tdtdtd Y nw || }zt |}W n! ty   t|}||krtdtd td	tdtd Y nw |d
kr|dkr|| | S td|||f |dkr|| d
 | }n|dk r|| d
 | }ntd|dkrtd||| |  S )Nz.randrange() will raise TypeError in the futurer6   z!non-integer arg 1 for randrange()zwnon-integer arguments to randrange() have been deprecated since Python 3.10 and will be removed in a subsequent versionz Missing a non-None stop argumentr   zempty range for randrange()z non-integer stop for randrange()z non-integer step for randrange()r7   z(empty range for randrange() (%d, %d, %d)zzero step for randrange())_indexrb   rM   rS   rT   ra   _ONErh   )	r;   startstopstepistartistopwidthisteprq   r=   r=   r>   r'   $  sv   	


zRandom.randrangec                 C   s   	 |  ||d S )Nr7   )r'   r;   rV   br=   r=   r>   r%   n  s   zRandom.randintc                 C   s   	 ||  t| S r9   )rh   rJ   )r;   seqr=   r=   r>   r   w  s   zRandom.choicec                 C   s   	 |d u r)| j }ttdt|D ]}||d }|| || ||< ||< qd S tdtd t}ttdt|D ]}|| |d  }|| || ||< ||< q:d S )Nr7   zuThe *random* parameter to shuffle() has been deprecated
since Python 3.9 and will be removed in a subsequent version.r6   )rh   reversedrangerJ   rS   rT   rt   )r;   r<   r&   	randbelowijr   r=   r=   r>   r+   |  s   zRandom.shuffle)countsc                   s  	 t tst trtdtd tntdt}|d ur]tt	|t|kr2t
d }t |ts?td|dkrGt
d| jt||d}t  fd	d
|D S | j}d|  krm|ksrt
d t
dd g| }d}	|dkr|	dtt|d d 7 }	||	krt}
t|D ]}||| }|
| ||< |
|| d  |
|< q|S t }|j}t|D ]}||}||v r||}||v s|| | ||< q|S )Nz\Sampling from a set deprecated
since Python 3.9 and will be removed in a subsequent version.r6   zAPopulation must be a sequence.  For dicts or sets, use sorted(d).z2The number of counts does not match the populationzCounts must be integersr   z)Total of counts must be greater than zero)rr   c                    s   g | ]	} | qS r=   r=   )r^   sr   
cum_counts
populationr=   r>   
<listcomp>  s    z!Random.sample.<locals>.<listcomp>z,Sample larger than population or is negative      r0   r8   r7   )rD   	_Sequence_SetrS   rT   r`   rb   rJ   list_accumulatera   poprM   r(   r   _bisectrh   _ceil_logsetadd)r;   r   rr   r   rq   total
selectionsr   resultsetsizepoolr   r   selectedselected_addr=   r   r>   r(     s^   
4




zRandom.sample)cum_weightsrr   c                   s  	 | j td u rE|d u r%td7 fddtd |D S ztt|W n tyD   t|ts: |}td|d w |d urMtdtkrWt	dd d dkret	dt
smt	d	t d
  fddtd |D S )N        c                    s   g | ]}    qS r=   r=   r^   r   )r   rq   r   r&   r=   r>   r     s    z"Random.choices.<locals>.<listcomp>z4The number of choices must be a keyword argument: k=z2Cannot specify both weights and cumulative weightsz3The number of weights does not match the populationrA   z*Total of weights must be greater than zerozTotal of weights must be finiter7   c                    s$   g | ]}   d  qS )r   r=   r   )r   r   hir   r&   r   r=   r>   r     s    )r&   rJ   rt   _repeatr   r   rb   rD   rM   ra   	_isfiniter   )r;   r   weightsr   rr   r=   )r   r   r   r   rq   r   r&   r   r>   r     sD   
zRandom.choicesc                 C   s   	 ||| |     S r9   r&   r   r=   r=   r>   r-   "  r]   zRandom.uniformr   r3   c                 C   s|   	 |   }z|d u rdn|| ||  }W n ty    | Y S w ||kr2d| }d| }||}}||| t||   S )N      ?r3   )r&   ZeroDivisionError_sqrt)r;   lowhighmodeurX   r=   r=   r>   r,   &  s    
zRandom.triangularc                 C   sT   	 | j }	 | }d|  }t|d  | }|| d }|t| kr#nq|||  S )NTr3   r   r2   )r&   NV_MAGICCONSTr   )r;   musigmar&   u1u2zzzr=   r=   r>   r"   :  s   

zRandom.normalvariatec                 C   sb   	 | j }| j}d | _|d u r+| t }tdtd|   }t|| }t|| | _|||  S )Ng       r3   )r&   r:   TWOPIr   r   _cos_sin)r;   r   r   r&   r   x2pig2radr=   r=   r>   r   O  s   
zRandom.gaussc                 C   s   	 t | ||S r9   )_expr"   )r;   r   r   r=   r=   r>   r!   u  s   zRandom.lognormvariatec                 C   s   	 t d|    | S Nr3   )r   r&   )r;   lambdr=   r=   r>   r     s   zRandom.expovariatec                 C   s   	 | j }|dkrt|  S d| }|td||   }	 | }tt| }|||  }| }	|	d||  k s@|	d| t| krAnqd| }
|
| d|
|   }| }|dkra|t| t }|S |t| t }|S )Ngư>r   r3   )r&   r   r   r   _pir   _acos)r;   r   kappar&   r   rs   r   r   dr   qfu3thetar=   r=   r>   r.     s,   
$	zRandom.vonmisesvariatec                 C   s|  	 |dks	|dkrt d| j}|dkrltd| d }|t }|| }	 | }d|  k r2dk s4n q$d|  }t|d|  | }	|t|	 }
|| | }|||	  |
 }|t d|  dksg|t|krk|
| S q%|dkrztd|   | S 	 | }t| t }|| }|dkr|d|  }
n	t|| |  }
| }|dkr||
|d  kr	 |
| S n|t|
 kr	 |
| S q{)	Nr   z*gammavariate: alpha and beta must be > 0.0r3   r1   TgHz>gP?r4   )ra   r&   r   LOG4r   r   SG_MAGICCONST_e)r;   alphabetar&   ainvbbbcccr   r   vr<   r   rs   r   r   pr=   r=   r>   r     sN   
 zRandom.gammavariatec                 C   s*   	 |  |d}|r|||  |d  S dS )Nr3   r   )r   )r;   r   r   yr=   r=   r>   r     s
   zRandom.betavariatec                 C   s   	 d|    }|d|  S )Nr3   g      r   )r;   r   r   r=   r=   r>   r#     s   zRandom.paretovariatec                 C   s$   	 d|    }|t| d|   S r   )r&   r   )r;   r   r   r   r=   r=   r>   r/     s   zRandom.weibullvariater9   )Nr6   )r   r3   N)$__name__
__module____qualname__r[   r?   r)   r    r*   re   rf   rg   ro   rk   BPFrl   rh   r$   r}   r'   r%   r   r+   r(   r   r-   r,   r"   r   r!   r   r.   r   r   r#   r/   __classcell__r=   r=   rY   r>   r   g   s@    
	*!J	
d(
&
*Ar   c                   @   s>   e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Ze ZZ	dS )r   c                 C   s   	 t tddd? t S )Nr@   rC   r8   )rM   rN   _urandom	RECIP_BPFr\   r=   r=   r>   r&   6  s   zSystemRandom.randomc                 C   s>   	 |dk r	t d|d d }tt|d}||d | ? S )Nr   z#number of bits must be non-negativer@   rx   rC   )ra   rM   rN   r   )r;   rr   numbytesr<   r=   r=   r>   r   :  s   zSystemRandom.getrandbitsc                 C   s
   	 t |S r9   )r   r{   r=   r=   r>   r$   B  s   zSystemRandom.randbytesc                 O   s   	 d S r9   r=   r;   argskwdsr=   r=   r>   r)   H  s   zSystemRandom.seedc                 O   s
   	 t d)Nz*System entropy source does not have state.)NotImplementedErrorr   r=   r=   r>   _notimplementedL  s   zSystemRandom._notimplementedN)
r   r   r   r&   r   r$   r)   r   r    r*   r=   r=   r=   r>   r   -  s    r   c                    s   ddl m}m} ddlm} | } fddtd | D }| }||}	|||	}
t|}t|}t|| dd|  dj	  td	|	|
||f  d S )
Nr   )stdevfmean)perf_counterc                    s   g | ]}  qS r=   r=   r   r   funcr=   r>   r   {  s    z#_test_generator.<locals>.<listcomp>z.3fz sec, z times z"avg %g, stddev %g, min %g, max %g
)

statisticsr   r   timer   r   minmaxprintr   )rq   r   r   r   meanr   t0datat1xbarr   r   r   r=   r   r>   _test_generatorv  s   
 r     c                 C   s   t | td t | td t | td t | td t | td t | td t | td t | td t | td t | td t | td	 t | td
 t | td t | td t | td t | td d S )Nr=   )r   r3   )g{Gz?r3   )皙?r3   )r   r1   )r   r3   )g?r3   )r3   r3   )r1   r3   )g      4@r3   )g      i@r3   )      @r   )r   r3   gUUUUUU?)	r   r&   r"   r!   r.   r   r   r   r,   )Nr=   r=   r>   _test  s    r   fork)after_in_child__main__)r   )Zwarningsr   rS   mathr   r   r   r   r   r   r   r   r   r   r   r   r	   r   r
   r   r   r   r   r   r   rt   r   r   osr   r   _collections_abcr   r   r   r   operatorr   r|   	itertoolsr   r   r   r   r   r   _os_randomrO   r   ImportErrorZhashlib__all__r   r   r   r   r   r}   r   r   _instr)   r&   r-   r,   r%   r   r'   r(   r+   r   r"   r!   r   r.   r   r   r   r#   r/   r    r*   r   r$   r   r   hasattrregister_at_forkr   r=   r=   r=   r>   <module>   s|    /
     K,



