B
    u9ak                 @   s  d dl mZ d dlmZ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 d dlmZ m!Z" d dl#m$Z% d dl&Z'd dl(Z)d dlZ*d	d
dddddddddddddddddddddd gZ+d!ed" ed# Z,d#e Z-e
d$Z.d%e
d& Z/d'Z0d(e0  Z1d dl2Z2G d)d	 d	e2j3Z3G d*d  d e3Z4d+d, Z5d3d.d/Z6e3 Z7e7j8Z8e7j9Z9e7j:Z:e7j;Z;e7j<Z<e7j=Z=e7j>Z>e7j?Z?e7j@Z@e7jAZAe7jBZBe7jCZCe7jDZDe7jEZEe7jFZFe7jGZGe7jHZHe7jIZIe7jJZJe7jKZKe7jLZLe7jMZMeNe*d0re*jOe7j8d1 ePd2kre6  dS )4    )warn)
MethodTypeBuiltinMethodType)logexppieceil)sqrtacoscossin)urandom)SetSequence)sha512N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      g       @g      @g      ?g      @5      c                   s  e Zd ZdZd:ddZd; fdd	Z fdd	Z fd
dZdd Zdd Z	dd Z
ddefddZdd Zede> eeefddZdd Zd<ddZdd Zd=dddd d!Zd"d# Zd>d&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z d8d9 Z!  Z"S )?r      Nc             C   s   |  | d | _d S )N)r   
gauss_next)selfx r1   /usr/lib/python3.7/random.py__init__X   s    
zRandom.__init__r,   c                s   |dkrt |ttfrt |tr*|dn|}|rBt|d d> nd}x"tt|D ]}d| |A d@ }qRW |t|N }|dkrdn|}|d	krt |tttfrt |tr| }|t	|
 7 }t|d
}t | d | _d S )N   zlatin-1r      iCB l    r,   big)
isinstancestrbytesdecodeordmaplen	bytearrayencode_sha512Zdigestint
from_bytessuperr   r.   )r/   aversionr0   c)	__class__r1   r2   r   a   s    
zRandom.seedc                s   | j t  | jfS )N)VERSIONrE   r%   r.   )r/   )rI   r1   r2   r%      s    zRandom.getstatec          
      s   |d }|dkr*|\}}| _ t | nt|dkr|\}}| _ ytdd |D }W n( tk
r| } z
t|W d d }~X Y nX t | ntd|| jf d S )Nr   r-   r,   c             s   s   | ]}|d  V  qdS )l        Nr1   ).0r0   r1   r1   r2   	<genexpr>   s    z"Random.setstate.<locals>.<genexpr>z?state with version %s passed to Random.setstate() of version %s)r.   rE   r&   tuple
ValueError	TypeErrorrJ   )r/   staterG   Zinternalstater   )rI   r1   r2   r&      s    zRandom.setstatec             C   s   |   S )N)r%   )r/   r1   r1   r2   __getstate__   s    zRandom.__getstate__c             C   s   |  | d S )N)r&   )r/   rP   r1   r1   r2   __setstate__   s    zRandom.__setstate__c             C   s   | j d|  fS )Nr1   )rI   r%   )r/   r1   r1   r2   
__reduce__   s    zRandom.__reduce__r4   c       
      C   s  ||}||krt d|d kr:|dkr2| |S t d||}||krRt d|| }|dkrx|dkrx|| | S |dkrt d|||f ||}||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()r4   z'empty range for randrange() (%d,%d, %d)z non-integer step for randrange()zzero step for randrange())rN   
_randbelow)
r/   startstopstep_intZistartZistopwidthZistepnr1   r1   r2   r      s4    

zRandom.randrangec             C   s   |  ||d S )Nr4   )r   )r/   rF   br1   r1   r2   r      s    zRandom.randintc             C   s   | j }| j}|||ks$|||krN| }	||	}
x|
|krH||	}
q6W |
S ||krltd || | S |dkr|td|| }|| | }| }
x|
|kr| }
qW ||
| | 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   zBoundary cannot be zero)r   r'   
bit_length_warnrN   )r/   rZ   rC   maxsizetypeZMethodZBuiltinMethodr   r'   krZremlimitr1   r1   r2   rT      s&    


zRandom._randbelowc             C   s:   y|  t|}W n tk
r0   tdd Y nX || S )Nz$Cannot choose from an empty sequence)rT   r?   rN   
IndexError)r/   seqir1   r1   r2   r      s
    zRandom.choicec             C   s   |d krR| j }xttdt|D ]*}||d }|| ||  ||< ||< q"W nLt}xFttdt|D ]0}|| |d  }|| ||  ||< ||< qjW d S )Nr4   )rT   reversedranger?   rC   )r/   r0   r   	randbelowre   jrX   r1   r1   r2   r     s    	 zRandom.shufflec             C   s&  t |trt|}t |ts$td| j}t|}d|  krF|ksPn tdd g| }d}|dkr|dtt	|d d 7 }||krt
|}xt|D ]0}||| }	||	 ||< ||| d  ||	< qW nRt }
|
j}xDt|D ]8}||}	x|	|
kr||}	qW ||	 ||	 ||< qW |S )	Nz>Population must be a sequence or set.  For dicts, use list(d).r   z,Sample larger than population or is negative      r*   r-   r4   )r9   _SetrM   	_SequencerO   rT   r?   rN   _ceil_loglistrg   setadd)r/   
populationr`   rh   rZ   resultZsetsizeZpoolre   ri   ZselectedZselected_addr1   r1   r2   r     s6    


zRandom.sample)cum_weightsr`   c               s   | j d krN|d kr>t t fddt|D S tt|n|d k	r^tdttkrvtdt	j
d td fddt|D S )Nc                s   g | ]}    qS r1   r1   )rK   re   )rX   rs   r   totalr1   r2   
<listcomp>d  s    z"Random.choices.<locals>.<listcomp>z2Cannot specify both weights and cumulative weightsz3The number of weights does not match the populationr6   r4   c                s$   g | ]}   d  qS )r   r1   )rK   re   )bisectru   hirs   r   rv   r1   r2   rw   m  s   )r   rC   r?   rg   rp   
_itertools
accumulaterO   rN   _bisectrx   )r/   rs   Zweightsru   r`   r1   )rX   rx   ru   ry   rs   r   rv   r2   r(   X  s     zRandom.choicesc             C   s   ||| |     S )N)r   )r/   rF   r[   r1   r1   r2   r   t  s    zRandom.uniform              ?c             C   sx   |   }y |d krdn|| ||  }W n tk
r<   |S X ||kr`d| }d| }|| }}||| t||   S )Ng      ?g      ?)r   ZeroDivisionError_sqrt)r/   ZlowZhighmodeurH   r1   r1   r2   r    z  s    	 
zRandom.triangularc             C   sT   | j }x@| }d|  }t|d  | }|| d }|t| krP qW |||  S )Ng      ?g      ?g      @)r   NV_MAGICCONSTro   )r/   musigmar   u1u2zZzzr1   r1   r2   r     s    
zRandom.normalvariatec             C   s   t | ||S )N)_expr   )r/   r   r   r1   r1   r2   r     s    zRandom.lognormvariatec             C   s   t d|    | S )Ng      ?)ro   r   )r/   Zlambdr1   r1   r2   r     s    zRandom.expovariatec             C   s   | j }|dkrt|  S d| }|td||   }xN| }tt| }|||  }| }	|	d||  k s~|	d| t| kr6P q6W d| }
|
| d|
|   }| }|dkr|t| t }n|t| t }|S )Ngư>g      ?g      ?)r   TWOPIr   _cos_pir   _acos)r/   r   Zkappar   sra   r   r   dr   qfZu3Zthetar1   r1   r2   r     s&    
$zRandom.vonmisesvariatec             C   s  |dks|dkrt d| j}|dkrtd| d }|t }|| }x| }d|  k rbdk sfqH qHd|  }t|d|  | }	|t|	 }
|| | }|||	  |
 }|t d|  dks|t|krH|
| S qHW n|dkr| }x|dkr| }qW t| | S x| }t| t }|| }|dkr@|d|  }
nt|| |  }
| }|dkrx||
|d  krP n|t|
 krP qW |
| S d S )Ng        z*gammavariate: alpha and beta must be > 0.0g      ?g       @gHz>gP?g      @)rN   r   r   LOG4ro   r   SG_MAGICCONST_e)r/   alphabetar   ZainvZbbbZcccr   r   vr0   r   ra   r   r[   pr1   r1   r2   r     sJ    
 




zRandom.gammavariatec             C   s`   | j }| j}d | _|d krT| t }tdtd|   }t|| }t|| | _|||  S )Ng       g      ?)r   r.   r   r   ro   r   _sin)r/   r   r   r   r   Zx2piZg2radr1   r1   r2   r!   @  s    
zRandom.gaussc             C   s0   |  |d}|dkrdS |||  |d  S d S )Ng      ?r   g        )r   )r/   r   r   yr1   r1   r2   r"   u  s    
zRandom.betavariatec             C   s   d|    }d|d|   S )Ng      ?)r   )r/   r   r   r1   r1   r2   r#     s    zRandom.paretovariatec             C   s"   d|    }|t| d|   S )Ng      ?)r   ro   )r/   r   r   r   r1   r1   r2   r$     s    zRandom.weibullvariate)N)Nr,   )N)N)r}   r~   N)#__name__
__module____qualname__rJ   r3   r   r%   r&   rQ   rR   rS   rC   r   r   BPFr_   _MethodType_BuiltinMethodTyperT   r   r   r   r(   r   r    r   r   r   r   r   r!   r"   r#   r$   __classcell__r1   r1   )rI   r2   r   H   s6   
	 ,

:
0H5	c               @   s4   e Z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 )Nr5   r8   r-   )rC   rD   _urandom	RECIP_BPF)r/   r1   r1   r2   r     s    zSystemRandom.randomc             C   sP   |dkrt d|t|kr$td|d d }tt|d}||d | ? S )Nr   z(number of bits must be greater than zeroz#number of bits should be an integerr5      r8   )rN   rC   rO   rD   r   )r/   r`   Znumbytesr0   r1   r1   r2   r'     s    zSystemRandom.getrandbitsc             O   s   d S )Nr1   )r/   argskwdsr1   r1   r2   r     s    zSystemRandom.seedc             O   s   t dd S )Nz*System entropy source does not have state.)NotImplementedError)r/   r   r   r1   r1   r2   _notimplemented  s    zSystemRandom._notimplementedN)	r   r   r   r   r'   r   r   r%   r&   r1   r1   r1   r2   r)     s
   
c             C   s   dd l }t| d|j d}d}d}d}| }x@t| D ]4}	|| }
||
7 }||
|
  }t|
|}t|
|}q8W | }tt|| dddd	 ||  }t||  ||  }td
||||f  d S )Nr   timesg        g    _Bg    _r-   zsec, )endz"avg %g, stddev %g, min %g, max %g
)	timeprintr   Zperf_counterrg   minmaxroundr   )rZ   funcr   r   rv   ZsqsumZsmallestZlargestZt0re   r0   Zt1ZavgZstddevr1   r1   r2   _test_generator  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 )Nr1   )g        g      ?)g{Gz?g      ?)g?g      ?)g?g       @)g      ?g      ?)g?g      ?)g      ?g      ?)g       @g      ?)g      4@g      ?)g      i@g      ?)g      @g      @)g        g      ?gUUUUUU?)	r   r   r   r   r   r   r!   r"   r    )Nr1   r1   r2   _test  s     r   fork)Zafter_in_child__main__)r   )Qwarningsr   r]   typesr   r   r   r   Zmathr   ro   r   r   r   r   r   r   r	   rn   r
   r   r   r   r   r   r   r   osr   r   _collections_abcr   rl   r   rm   Zhashlibr   rB   	itertoolsrz   rx   r|   _os__all__r   r   r   r   r   r   Z_randomr   r)   r   r   Z_instr   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   r1   r1   r1   r2   <module>(   sr   
    Y!

