U
    g~                     @   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   </tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/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|std|dkrtdt|| |}|dk rd}|dk rt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
Cryptodomer	   ZCryptodome.Util.py3compatr
   objectr   _rr   r   r   r   r   r   ZCryptodome.Util.numberr   r   r7   r   r   r   r   r   <module>   s   `