python - Pseudorandom number generator for hashing that can take in any size table -


i constructing pseudo random number generator hashing. algorithm need use follows:

  • initialize integer r equal 1 every time tabling routine called
  • on each successive call random number, set r = r*5
  • mask lower order n+2 bits of product , place result in r
  • set p = r/4 , return

this have far works table of size 2^n, how can change can take in table of size?

    def rand(size,i)         n = math.log(size,2)         r = 1         random_list = []         mask = (1 << 2+int(n)) - 1         n in range(1,size+1):             r = r*5             r &= mask             p = r/4             random_list = random_list + [p]         if == 0: return random_list         else: return random_list[i-1] 

i didn't understand how code related algorithm (what random_list?) or how code should structured, assume similar this:

class rand:     def __init__(self, n):         # initialize integer r equal 1 every time tabling routine called         self.r = 1         self.n = n      def rand(self):         # on each successive call random number, set r = r*5         self.r *= 5         # mask lower order n+2 bits of product , place result in r         self.r = self.r & (pow(2, self.n)-1)         # set p = r/4 , return          self.p = self.r/4         return self.p 

in case, make work table of size, class becomes this:

class rand2:     def __init__(self, tablesize):         # initialize integer r equal 1 every time tabling routine called         self.r = 1         self.tablesize = tablesize      def rand(self):         # on each successive call random number, set r = r*5         self.r *= 5         # bit mask modulus operation, instead         self.r = self.r % self.tablesize         # set p = r/4 , return         self.p = self.r/4         return self.p 

a simple test proves outcome same when table sizes identical:

rnd = rand(10) in range(0, 10):     print rnd.rand()  rnd2 = rand2(pow(2, 10)) in range(0, 10):     print rnd2.rand() 

but, said, didn't understand how code related algorithm. guess tl;dr here use modulus operator instead of bit mask.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -