U
    ÈZjr  ã                   @   s€   d ddddddgZ ddlmZ dd	lmZ G d
d „ d eƒZeƒ ZejZej	Z	ej
Z
ejZejZejZddlmZmZmZmZ dS )ÚStrongRandomÚgetrandbitsÚ	randrangeÚrandintÚchoiceÚshuffleÚsampleé    )ÚRandom)Úis_native_intc                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )r   Nc                 C   sV   |d kr|d krd | _ n:|d k	r0|d kr0|| _ n"|d krJ|d k	rJ|j| _ ntdƒ‚d S )Nz(Cannot specify both 'rng' and 'randfunc')Ú	_randfuncÚreadÚ
ValueError)ÚselfÚrngZrandfunc© r   úW/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/Random/random.pyÚ__init__    s    
zStrongRandom.__init__c                 C   s:   | j dkrt ¡ j| _ d|> d }|t|   t|dƒ¡ƒ@ S )z%Return an integer with k random bits.Né   é   )r   r	   Únewr   Úbytes_to_longÚceil_div)r   ÚkÚmaskr   r   r   r   *   s    
zStrongRandom.getrandbitsc                 G   sì   t |ƒdkr|\}}}nHt |ƒdkr2|\}}d}n.t |ƒdkrN|\}d}d}ntdt |ƒf ƒ‚t|ƒrxt|ƒrxt|ƒs€tdƒ‚|dkr�tdƒ‚t|| |ƒ}|dk rªd}|dk rÄtd|||f ƒ‚|}||krà|  t|ƒ¡}qÈ|||  S )	zkrandrange([start,] stop[, step]):
        Return a randomly-selected element from range(start, stop, step).é   é   r   r   z.randrange expected at most 3 arguments, got %dz$randrange requires integer argumentsz(randrange step argument must not be zeroz%empty range for randrange(%r, %r, %r))ÚlenÚ	TypeErrorr
   r   r   r   Úsize)r   ÚargsÚstartÚstopÚstepÚnum_choicesÚrr   r   r   r   2   s2    ÿzStrongRandom.randrangec                 C   sF   t |ƒrt |ƒstdƒ‚|  ||d ¡}||  kr<|ksBn t‚|S )z0Return a random integer N such that a <= N <= b.z"randint requires integer argumentsr   )r
   r   r   ÚAssertionError)r   ÚaÚbÚNr   r   r   r   S   s
    zStrongRandom.randintc                 C   s&   t |ƒdkrtdƒ‚||  t |ƒ¡ S )zrReturn a random element from a (non-empty) sequence.

        If the seqence is empty, raises IndexError.
        r   zempty sequence)r   Ú
IndexErrorr   )r   Úseqr   r   r   r   [   s    zStrongRandom.choicec                 C   sH   t t|ƒd ddƒD ].}|  d|d ¡}|| ||  ||< ||< qdS )zShuffle the sequence in place.r   r   éÿÿÿÿN)Úranger   r   )r   ÚxÚiÚjr   r   r   r   d   s    zStrongRandom.shufflec                 C   sh   t |ƒ}||krtdƒ‚g }i }t|ƒD ]:}d}|dks@||krL|  |¡}q0| || ¡ d||< q(|S )zNReturn a k-length list of unique elements chosen from the population sequence.zsample larger than populationNr   )r   r   r,   r   Úappend)r   Ú
populationr   r#   ÚretvalÚselectedr.   r$   r   r   r   r   n   s    
zStrongRandom.sample)NN)
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r   r   r      s   

!	
)r   r   Úlong_to_bytesr   N)Ú__all__ZCryptor	   ZCrypto.Util.py3compatr
   Úobjectr   Ú_rr   r   r   r   r   r   ZCrypto.Util.numberr   r   r7   r   r   r   r   r   Ú<module>   s   `