U +Mbr@sdddddddgZddlmZdd lmZGd ddeZeZejZej Z ej Z ej Z ej Z ej Z dd lmZmZmZmZd S) StrongRandom getrandbits randrangerandintchoiceshufflesample)Random) is_native_intc@sFeZdZdddZddZddZdd Zd d Zd d ZddZ dS)rNcCsV|dkr|dkrd|_n:|dk r0|dkr0||_n"|dkrJ|dk rJ|j|_ntddS)Nz(Cannot specify both 'rng' and 'randfunc') _randfuncread ValueError)selfrngZrandfuncr;/tmp/pip-target-t616c12r/lib/python/Crypto/Random/random.py__init__ s zStrongRandom.__init__cCs:|jdkrtj|_d|>d}|t|t|d@S)z%Return an integer with k random bits.N)r r newr bytes_to_longceil_div)rkmaskrrrr*s   zStrongRandom.getrandbitscGst|dkr|\}}}nHt|dkr2|\}}d}n.t|dkrN|\}d}d}ntdt|ft|rxt|rxt|std|dkrtdt|||}|dkrd}|dkrtd|||f|}||kr|t|}q|||S) zkrandrange([start,] stop[, step]): Return a randomly-selected element from range(start, stop, step).rrz.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 rrsize)rargsstartstopstep num_choicesrrrrr2s2    zStrongRandom.randrangecCsFt|rt|std|||d}||kr<|ksBnt|S)z0Return a random integer N such that a <= N <= b.z"randint requires integer argumentsr)r rrAssertionError)rabNrrrrSs zStrongRandom.randintcCs&t|dkrtd||t|S)zrReturn a random element from a (non-empty) sequence. If the seqence is empty, raises IndexError. rzempty sequence)r IndexErrorr)rseqrrrr[s zStrongRandom.choicecCsHtt|dddD].}|d|d}||||||<||<qdS)zShuffle the sequence in place.rrN)rangerr)rxijrrrrdszStrongRandom.shufflecCsht|}||krtdg}i}t|D]:}d}|dks@||krL||}q0|||d||<q(|S)zNReturn a k-length list of unique elements chosen from the population sequence.zsample larger than populationNr)rr r,rappend)r populationrr#retvalselectedr.r$rrrrns   zStrongRandom.sample)NN) __name__ __module__ __qualname__rrrrrrrrrrrrs !  )rr long_to_bytesrN)__all__ZCryptor ZCrypto.Util.py3compatr objectr_rrrrrrrZCrypto.Util.numberrrr7rrrrrs  `