
nWe                 @   sv  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	 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% Z+ d& e+ Z, d  d' l- Z- Gd( d   d e- j.  Z. Gd) d   d e.  Z/ d* d+   Z0 d, d- d.  Z1 e.   Z2 e2 j3 Z3 e2 j4 Z4 e2 j5 Z5 e2 j6 Z6 e2 j7 Z7 e2 j8 Z8 e2 j9 Z9 e2 j: Z: e2 j; Z; e2 j< Z< e2 j= Z= e2 j> Z> e2 j? Z? e2 j@ Z@ e2 jA ZA e2 jB ZB e2 jC ZC e2 jD ZD e2 jE ZE e2 jF ZF e2 jG ZG eH d/ k rre1   d' S)0    )warn)
MethodTypeBuiltinMethodType)logexppieceil)sqrtacoscossin)urandom)SetSequence)sha512Randomseedrandomuniformrandintchoicesample	randrangeshufflenormalvariatelognormvariateexpovariatevonmisesvariategammavariate
triangulargaussbetavariateparetovariateweibullvariategetstatesetstategetrandbitsSystemRandom   g      ?g       @g      @g      ?g      @5      Nc                   sy  e  Z d  Z d Z d d d  Z d 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 d d  Z d d   Z e d e >e e e d d  Z d d   Z d d d  Z d d   Z d d    Z d! d" d d# d$  Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z    S)7r      Nc             C   s   |  j  |  d  |  _ d  S)N)r   
gauss_next)selfx r0   >/afs/cs.wisc.edu/s/python-3.5.2/src/Python-3.5.2/Lib/random.py__init__T   s    zRandom.__init__r+   c                s   | d  k r_ y t  j t d  d  } Wn4 t k
 r^ d d  l } t  | j   d  } Yn X| d k r t | t t t f  r t | t  r | j	   } | t
 |  j   7} t  j | d  } t   j |  d  |  _ d  S)Ni	  bigr      r+   )int
from_bytes_urandomNotImplementedErrortime
isinstancestrbytes	bytearrayencode_sha512digestsuperr   r-   )r.   aversionr9   )	__class__r0   r1   r   ]   s    zRandom.seedc                s   |  j  t   j   |  j f S)N)VERSIONrA   r%   r-   )r.   )rD   r0   r1   r%   }   s    zRandom.getstatec                s   | d } | d k r; | \ } } |  _  t   j |  n | d k r | \ } } |  _  y t d d   | D  } Wn. t k
 r } z t |  WYd  d  } ~ Xn Xt   j |  n t d | |  j f   d  S)Nr   r,   r+   c             s   s   |  ] } | d Vq d S)r+       Nl        r0   ).0r/   r0   r0   r1   	<genexpr>   s    z"Random.setstate.<locals>.<genexpr>z?state with version %s passed to Random.setstate() of version %s)r-   rA   r&   tuple
ValueError	TypeErrorrE   )r.   staterC   Zinternalstater   )rD   r0   r1   r&      s    
zRandom.setstatec             C   s
   |  j    S)N)r%   )r.   r0   r0   r1   __getstate__   s    zRandom.__getstate__c             C   s   |  j  |  d  S)N)r&   )r.   rL   r0   r0   r1   __setstate__   s    zRandom.__setstate__c             C   s   |  j  f  |  j   f S)N)rD   r%   )r.   r0   r0   r1   
__reduce__   s    zRandom.__reduce__   c       
      C   sp  | |  } | | k r$ t  d   | d  k rU | d k rI |  j |  St  d   | |  } | | k ry t  d   | | } | d k r | d k r | |  j |  S| d k r t  d | | | f   | |  } | | k r t  d   | d k r| | d | }	 n- | d k  r7| | d | }	 n t  d   |	 d k r[t  d   | | |  j |	  S)	Nz!non-integer arg 1 for randrange()r   zempty range for randrange()z non-integer stop for randrange()rP   z'empty range for randrange() (%d,%d, %d)z non-integer step for randrange()zzero step for randrange())rJ   
_randbelow)
r.   startstopstep_intZistartZistopwidthZistepnr0   r0   r1   r      s4    

zRandom.randrangec             C   s   |  j  | | d  S)NrP   )r   )r.   rB   br0   r0   r1   r      s    zRandom.randintc             C   s   |  j  } |  j } | |  | k s6 | |  | k rq | j   }	 | |	  }
 x |
 | k rl | |	  }
 qQ W|
 S| | k r t d  | |   |  S| | } | | | } |   }
 x |
 | k r |   }
 q W| |
 |  | 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'   
bit_length_warn)r.   rW   r5   maxsizetypeZMethodZBuiltinMethodr   r'   krZremlimitr0   r0   r1   rQ      s"    		$

	zRandom._randbelowc             C   sB   y |  j  t |   } Wn t k
 r9 t d   Yn X| | S)Nz$Cannot choose from an empty sequence)rQ   lenrJ   
IndexError)r.   seqir0   r0   r1   r      s
    zRandom.choicec             C   s   | d  k rk |  j  } x t t d t |    D]3 } | | d  } | | | | | | <| | <q1 Wn` t } xW t t d t |    D]: } | |   | d  } | | | | | | <| | <q Wd  S)NrP   )rQ   reversedranger`   r5   )r.   r/   r   	randbelowrc   jrU   r0   r0   r1   r     s    		"$"zRandom.shufflec             C   s  t  | t  r t |  } t  | t  s6 t d   |  j } t |  } d | k ob | k n ss t d   d  g | } d } | d k r | d t t	 | d d   7} | | k rt
 |  } x t |  D]: } | | |  }	 | |	 | | <| | | d | |	 <q Wnl t   }
 |
 j } xW t |  D]I } | |  }	 x |	 |
 k rh| |  }	 qMW| |	  | |	 | | <q8W| S)	Nz>Population must be a sequence or set.  For dicts, use list(d).r   zSample larger than population      r)   r,   rP   )r:   _SetrI   	_SequencerK   rQ   r`   rJ   _ceil_loglistre   setadd)r.   Z
populationr]   rf   rW   resultZsetsizepoolrc   rg   ZselectedZselected_addr0   r0   r1   r     s6    	!		
zRandom.samplec             C   s   | | | |  j    S)N)r   )r.   rB   rX   r0   r0   r1   r   V  s    zRandom.uniformg        g      ?c             C   s   |  j    } y( | d  k r! d n | | | | } Wn t k
 rL | SYn X| | k rz d | } d | } | | } } | | | | | d S)Ng      ?g      ?)r   ZeroDivisionError)r.   ZlowZhighmodeucr0   r0   r1   r    \  s    	(	

zRandom.triangularc             C   sf   |  j  } xN |   } d |   } t | d | } | | d } | t |  k r Pq W| | | S)Ng      ?g      ?g      @)r   NV_MAGICCONSTrm   )r.   musigmar   u1u2zZzzr0   r0   r1   r   r  s    		zRandom.normalvariatec             C   s   t  |  j | |   S)N)_expr   )r.   rx   ry   r0   r0   r1   r     s    zRandom.lognormvariatec             C   s   t  d |  j    | S)Ng      ?)rm   r   )r.   Zlambdr0   r0   r1   r     s    zRandom.expovariatec             C   s  |  j  } | d k r  t |   Sd | } | t d | |  } xc |   } t t |  } | | | } |   }	 |	 d | | k  s |	 d | t |  k rE PqE Wd | }
 |
 | d |
 | } |   } | d k r | t |  t } n | t |  t } | S)Ngư>g      ?g      ?)r   TWOPI_sqrt_cos_pir}   _acos)r.   rx   Zkappar   sr^   rz   r|   dr{   qfZu3Zthetar0   r0   r1   r     s&    	
		.
	zRandom.vonmisesvariatec             C   s  | d k s | d k r$ t  d   |  j } | d k rt d | d  } | t } | | } x|   } d | k  o d k  n s qd d |   } t | d |  | }	 | t |	  }
 | | | } | | |	 |
 } | t d | d k s| t |  k rd |
 | Sqd Wn | d k rZ|   } x | d k rJ|   } q2Wt |  | Sx |   } t | t } | | } | d k r| d | }
 n t | | |  }
 |   } | d k r| |
 | d k rPq]| t |
  k r]Pq]W|
 | Sd  S)Ng        z*gammavariate: alpha and beta must be > 0.0g      ?g       @gHz>gP?g      @)rJ   r   r   LOG4rm   r}   SG_MAGICCONST_e)r.   alphabetar   ZainvZbbbZcccrz   r{   vr/   r|   r^   ru   rX   pr0   r0   r1   r     sJ    	

	*		
	zRandom.gammavariatec             C   s   |  j  } |  j } d  |  _ | d  k rt |   t } t d t d |     } t |  | } t |  | |  _ | | | S)Ng       @g      ?g       )r   r-   r~   r   rm   r   _sin)r.   rx   ry   r   r|   Zx2piZg2radr0   r0   r1   r!   "  s    			zRandom.gaussc             C   s>   |  j  | d  } | d k r" d S| | |  j  | d  Sd  S)Ng      ?r   g        )r   )r.   r   r   yr0   r0   r1   r"   W  s    
zRandom.betavariatec             C   s    d |  j    } d | d | S)Ng      ?)r   )r.   r   ru   r0   r0   r1   r#   i  s    zRandom.paretovariatec             C   s'   d |  j    } | t |  d | S)Ng      ?)r   rm   )r.   r   r   ru   r0   r0   r1   r$   r  s    zRandom.weibullvariate)!__name__
__module____qualname__rE   r2   r   r%   r&   rM   rN   rO   r5   r   r   BPFr\   _MethodType_BuiltinMethodTyperQ   r   r   r   r   r    r   r   r   r   r   r!   r"   r#   r$   r0   r0   )rD   r1   r   D   s4   	 ,>0H5	c               @   sJ   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  j t d  d  d ?t S)N   r3   r,   )r5   r6   r7   	RECIP_BPF)r.   r0   r0   r1   r     s    zSystemRandom.randomc             C   sl   | d k r t  d   | t |  k r6 t d   | d d } t j t |  d  } | | d | ?S)Nr   z(number of bits must be greater than zeroz#number of bits should be an integerr      r3   )rJ   r5   rK   r6   r7   )r.   r]   numbytesr/   r0   r0   r1   r'     s    zSystemRandom.getrandbitsc             O   s   d  S)Nr0   )r.   argskwdsr0   r0   r1   r     s    zSystemRandom.seedc             O   s   t  d   d  S)Nz*System entropy source does not have state.)r8   )r.   r   r   r0   r0   r1   _notimplemented  s    zSystemRandom._notimplementedN)	r   r   r   r   r'   r   r   r%   r&   r0   r0   r0   r1   r(     s
   
c             C   s  d d  l  } t |  d | j  d } d } d } d
 } | j    } xV t |   D]H }	 | |   }
 | |
 7} | |
 |
 } t |
 |  } t |
 |  } qP W| j    } t t | | d  d d d | |  } t | |  | |  } t d	 | | | | f  d  S)Nr   timesg        g    _Br,   zsec,end z"avg %g, stddev %g, min %g, max %g
g    _)r9   printr   re   minmaxroundr   )rW   funcr   r9   totalZsqsumZsmallestZlargestZt0rc   r/   Zt1ZavgZstddevr0   r0   r1   _test_generator  s&    
 
r   i  c             C   s  t  |  t f   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)N              ?{Gz?皙?       @      ??      4@      i@      @)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   UUUUUU?)r   r   r   )	r   r   r   r   r   r   r!   r"   r    )Nr0   r0   r1   _test  s     r   __main__)Iwarningsr   rZ   typesr   r   r   r   mathr   rm   r   r}   r   r   r   r   r	   rl   r
   r   r   r   r   r   r   r   osr   r7   _collections_abcr   rj   r   rk   Zhashlibr   r?   __all__rw   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   r0   r0   r0   r1   <module>'   sb   ("		
  =!																						