a
    zez                     @   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 d dlmZ d dlmZ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
l+m,Z+ W n e-y   d d
l.m,Z+ Y n0 g dZ/ded ed Z0edZ1ded Z2dZ3de3  Z4G dd de*j5Z5G dd de5Z6e5 Z7e7j8Z8e7j9Z9e7j:Z:e7j;Z;e7j<Z<e7j=Z=e7j>Z>e7j?Z?e7j@Z@e7jAZAe7jBZBe7jCZCe7jDZDe7jEZEe7jFZFe7jGZGe7jHZHe7jIZIe7jJZJe7jKZKe7jLZLe7jMZMe7jNZNdd ZOd ddZPeQe)dre)jRe7j8d eSdkreP  d	S )!    )warn)logexppieceil)sqrtacoscossin)taufloor)urandom)SetSequence)
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dCddZdd Zdd  ZdDd!d"Zdd#d$d%ZdEddd&d'd(Zd)d* ZdFd-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 )Gr      Nc                 C   s   |  | d | _d S N)r'   
gauss_next)selfx r:   /usr/lib/python3.9/random.py__init__u   s    
zRandom.__init__r4   c                    s  |dkrt |ttfrt |tr*|dn|}|rBt|d d> nd}tt|D ]}d| |A d@ }qP|t|N }|dkr~dn|}nj|d	krt |tttfrt |tr| }t	
|t|  d
}n&t |td t	ttttfstdtd	 t | d | _d S )N   zlatin-1r      iCB l    r4   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'   r7   )r8   aversionr9   c	__class__r:   r;   r'   ~   s"    
zRandom.seedc                    s   | j t  | jfS r6   )VERSIONrS   r   r7   r8   rW   r:   r;   r      s    zRandom.getstatec              
      s   |d }|dkr*|\}}| _ t | nv|dkr|\}}| _ ztdd |D }W n* ty~ } zt|W Y d }~n
d }~0 0 t | ntd|| jf d S )Nr   r5   r4   c                 s   s   | ]}|d  V  qdS )l        Nr:   ).0r9   r:   r:   r;   	<genexpr>       z"Random.setstate.<locals>.<genexpr>z?state with version %s passed to Random.setstate() of version %s)r7   rS   r(   tuple
ValueError	TypeErrorrY   )r8   staterU   internalstater   rW   r:   r;   r(      s    zRandom.setstatec                 C   s   |   S r6   )r   rZ   r:   r:   r;   __getstate__   s    zRandom.__getstate__c                 C   s   |  | d S r6   )r(   )r8   ra   r:   r:   r;   __setstate__   s    zRandom.__setstate__c                 C   s   | j d|  fS )Nr:   )rX   r   rZ   r:   r:   r;   
__reduce__   s    zRandom.__reduce__c                K   sJ   | j D ]>}d|jv r qFd|jv r.| j| _ qFd|jv r| j| _ qFqd S )N
_randbelowr   r$   )__mro____dict___randbelow_with_getrandbitsrf   _randbelow_without_getrandbits)clskwargsrV   r:   r:   r;   __init_subclass__   s    	



zRandom.__init_subclass__c                 C   s4   |sdS | j }| }||}||kr0||}q|S )Nr   )r   
bit_length)r8   nr   krr:   r:   r;   ri      s    
z"Random._randbelow_with_getrandbitsr=   c                 C   sj   | j }||kr$td t| | S |dkr0dS || }|| | }| }||krZ| }qJt|| | 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$   rQ   _floor)r8   ro   maxsizer$   remlimitrq   r:   r:   r;   rj      s    z%Random._randbelow_without_getrandbitsc                 C   s   |  |d |dS )N   little)r   to_bytesr8   ro   r:   r:   r;   r"     s    zRandom.randbytesc           	      C   s  t |}||krtd|d u r:|dkr2| |S tdt |}||krRtd|| }|dkrx|dkrx|| | S |dkrtd|||f t |}||krtd|dkr|| d | }n"|dk r|| d | }ntd|dkrtd||| |  S )	Nz!non-integer arg 1 for randrange()r   zempty range for randrange()z non-integer stop for randrange()r=   z(empty range for randrange() (%d, %d, %d)z non-integer step for randrange()zzero step for randrange())rK   r_   rf   )	r8   startstopstepistartistopwidthistepro   r:   r:   r;   r%   "  s4    

zRandom.randrangec                 C   s   |  ||d S )Nr=   )r%   r8   rT   br:   r:   r;   r#   N  s    zRandom.randintc                 C   s   ||  t| S r6   )rf   rH   )r8   seqr:   r:   r;   r   W  s    zRandom.choicec                 C   s   |d u rN| j }ttdt|D ]*}||d }|| ||  ||< ||< q nTtdtd t}ttdt|D ]0}|| |d  }|| ||  ||< ||< qpd S )Nr=   zuThe *random* parameter to shuffle() has been deprecated
since Python 3.9 and will be removed in a subsequent version.r4   )rf   reversedrangerH   rQ   rR   rr   )r8   r9   r$   	randbelowijr   r:   r:   r;   r)   \  s    	zRandom.shuffle)countsc                   s  t trtdtd tt ts0tdt}|d urtt	|t|kr`t
d }t |tsztd|dkrt
d| jt||d}t  fd	d
|D S | j}d|  kr|ksn t
dd g| }d}	|dkr|	dtt|d d 7 }	||	kr\t}
t|D ]2}||| }|
| ||< |
|| d  |
|< q&nNt }|j}t|D ]8}||}||v r||}q||| | ||< qp|S )Nz\Sampling from a set deprecated
since Python 3.9 and will be removed in a subsequent version.r4   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)rp   c                    s   g | ]} | qS r:   r:   )r[   sr   
cum_counts
populationr:   r;   
<listcomp>  r]   z!Random.sample.<locals>.<listcomp>z,Sample larger than population or is negative      r.   r5   r=   )rB   _SetrQ   rR   r^   	_Sequencer`   rH   list_accumulater_   poprK   r&   r   _bisectrf   _ceil_logsetadd)r8   r   rp   r   ro   total
selectionsr   resultsetsizepoolr   r   selectedselected_addr:   r   r;   r&   v  sT    5






zRandom.sample)cum_weightsrp   c                   s   | j td u r|d u rHtd7 fddtd |D S ztt|W q ty   t|tsr |}td|d Y q0 n|d urtdtkrt	dd d dkrt	dt
 d	  fd
dtd |D S )N        c                    s   g | ]}    qS r:   r:   r[   r   )r   ro   r   r$   r:   r;   r     r]   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 populationr?   z*Total of weights must be greater than zeror=   c                    s$   g | ]}   d  qS )r   r:   r   )r   r   hir   r$   r   r:   r;   r     s   )r$   rH   rr   _repeatr   r   r`   rB   rK   r_   r   )r8   r   weightsr   rp   r:   )r   r   r   r   ro   r   r$   r   r;   r     s<    

zRandom.choicesc                 C   s   ||| |     S r6   r$   r   r:   r:   r;   r+     s    zRandom.uniformr   r1   c                 C   sz   |   }z |d u rdn|| ||  }W n ty>   | Y S 0 ||krbd| }d| }|| }}||| t||   S )N      ?r1   )r$   ZeroDivisionError_sqrt)r8   lowhighmodeurV   r:   r:   r;   r*     s    	 

zRandom.triangularc                 C   sP   | j }| }d|  }t|d  | }|| d }|t| krqDq|||  S )Nr1   r   r0   )r$   NV_MAGICCONSTr   )r8   musigmar$   u1u2zzzr:   r:   r;   r      s    
zRandom.normalvariatec                 C   s`   | j }| j}d | _|d u rT| t }tdtd|   }t|| }t|| | _|||  S )Ng       r1   )r$   r7   TWOPIr   r   _cos_sin)r8   r   r   r$   r   x2pig2radr:   r:   r;   r   ,  s    
zRandom.gaussc                 C   s   t | ||S r6   )_expr    )r8   r   r   r:   r:   r;   r   R  s    zRandom.lognormvariatec                 C   s   t d|    | S Nr1   )r   r$   )r8   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r4qq4d| }
|
| d|
|   }| }|dkr|t| t }n|t| t }|S )Ngư>r   r1   )r$   r   r   r   _pir   _acos)r8   r   kappar$   r   rq   r   r   dr   qfu3thetar:   r:   r;   r,   m  s$    
$zRandom.vonmisesvariatec                 C   s~  |dks|dkrt d| j}|dkrtd| d }|t }|| }| }d|  k r`dk sdqF qFd|  }t|d|  | }	|t|	 }
|| | }|||	  |
 }|t d|  dks|t|krF|
| S qFn|dkrtd|   | S | }t| t }|| }|dkr$|d|  }
nt|| |  }
| }|dkr^||
|d  krpqrq|t|
 krqrq|
| S d S )Nr   z*gammavariate: alpha and beta must be > 0.0r1   r/   gHz>gP?r2   )r_   r$   r   LOG4r   r   SG_MAGICCONST_e)r8   alphabetar$   ainvbbbcccr   r   vr9   r   rq   r   r   pr:   r:   r;   r     s@    
 

zRandom.gammavariatec                 C   s(   |  |d}|r$|||  |d  S dS )Nr1   r   )r   )r8   r   r   yr:   r:   r;   r     s    zRandom.betavariatec                 C   s   d|    }d|d|   S r   r   )r8   r   r   r:   r:   r;   r!     s    zRandom.paretovariatec                 C   s"   d|    }|t| d|   S r   )r$   r   )r8   r   r   r   r:   r:   r;   r-     s    zRandom.weibullvariate)N)Nr4   )Nr=   )N)N)r   r1   N)#__name__
__module____qualname__rY   r<   r'   r   r(   rc   rd   re   rm   ri   BPFrj   rf   r"   r%   r#   r   r)   r&   r   r+   r*   r    r   r   r   r,   r   r   r!   r-   __classcell__r:   r:   rW   r;   r   e   s<   
	*!
,	
c&
&
*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>   rA   r5   )rK   rL   _urandom	RECIP_BPFrZ   r:   r:   r;   r$     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>   rv   rA   )r_   rK   rL   r   )r8   rp   numbytesr9   r:   r:   r;   r     s
    zSystemRandom.getrandbitsc                 C   s   t |S r6   )r   ry   r:   r:   r;   r"     s    zSystemRandom.randbytesc                 O   s   d S r6   r:   r8   argskwdsr:   r:   r;   r'   %  s    zSystemRandom.seedc                 O   s   t dd S )Nz*System entropy source does not have state.)NotImplementedErrorr   r:   r:   r;   _notimplemented)  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 }| }||}	|||	}
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   X  r]   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   )ro   r   r   r   meanr   t0datat1xbarr   r   r   r:   r   r;   _test_generatorS  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   r1   )g{Gz?r1   )皙?r1   )r   r/   )r   r1   )g?r1   )r1   r1   )r/   r1   )g      4@r1   )g      i@r1   )      @r   )r   r1   gUUUUUU?)	r   r$   r    r   r,   r   r   r   r*   )Nr:   r:   r;   _testd  s     r   fork)after_in_child__main__)r   )Twarningsr   rQ   mathr   r   r   r   r   r   r   r   r   r   r   r   r	   r   r
   r   r   r   r   r   r   rr   osr   r   _collections_abcr   r   r   r   	itertoolsr   r   r   r   r   r   _os_randomrM   r   ImportErrorZhashlib__all__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>0   sp   
     *,

