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
Post a Comment