


"""Convenience functions for random operations. Not suitable for security / cryptography operations."""








import os




import random




from pyelliptic.openssl import OpenSSL




NoneType = type(None)












def randomBytes(n):




"""Method randomBytes."""




try:




return os.urandom(n)




except NotImplementedError:




return OpenSSL.rand(n)












def randomshuffle(population):




"""Method randomShuffle.








shuffle the sequence x in place.




shuffles the elements in list in place,




so they are in a random order.




As Shuffle will alter data inplace,




so its input must be a mutable sequence.




In contrast, sample produces a new list




and its input can be much more varied




(tuple, string, xrange, bytearray, set, etc)




"""




random.shuffle(population)












def randomsample(population, k):




"""Method randomSample.








return a k length list of unique elements




chosen from the population sequence.




Used for random sampling




without replacement, its called




partial shuffle.




"""




return random.sample(population, k)












def randomrandrange(x, y=None):




"""Method randomRandrange.








return a randomly selected element from




range(start, stop). This is equivalent to




choice(range(start, stop)),




but doesnt actually build a range object.




"""




if isinstance(y, NoneType):




return random.randrange(x) # nosec




else:




return random.randrange(x, y) # nosec












def randomchoice(population):




"""Method randomchoice.








Return a random element from the nonempty




sequence seq. If seq is empty, raises




IndexError.




"""




return random.choice(population) # nosec
