我正在构建一个用于散列的伪随机数生成器。我需要使用的算法如下:
这是我到目前为止适用于大小为2 ^ n的表的内容,但是如何更改它以便可以接收任何大小的表?
def rand(size,i)
n = math.log(size,2)
r = 1
random_list = []
mask = (1 << 2+int(n)) - 1
for n in range(1,size+1):
r = r*5
r &= mask
p = r/4
random_list = random_list + [p]
if i == 0: return random_list
else: return random_list[i-1]
答案 0 :(得分:0)
我真的不明白你的代码与你的算法有什么关系(什么是random_list?)或代码应该如何构造,但我认为它与此类似:
class Rand:
def __init__(self, n):
# Initialize an integer R to be equal to 1 every time the tabling routine is called
self.r = 1
self.n = n
def rand(self):
# On each successive call for a random number, set R = R*5
self.r *= 5
# Mask all but the lower order n+2 bits of the product and place the result in R
self.r = self.r & (pow(2, self.n)-1)
# Set P = R/4 and return
self.p = self.r/4
return self.p
在这种情况下,要使其适用于任何大小的表,该类将变为:
class Rand2:
def __init__(self, tableSize):
# Initialize an integer R to be equal to 1 every time the tabling routine is called
self.r = 1
self.tableSize = tableSize
def rand(self):
# On each successive call for a random number, set R = R*5
self.r *= 5
# A bit mask is essentially a modulus operation, which is what we do instead
self.r = self.r % self.tableSize
# Set P = R/4 and return
self.p = self.r/4
return self.p
当表格大小相同时,一个简单的测试证明结果是相同的:
rnd = Rand(10)
for i in range(0, 10):
print rnd.rand()
rnd2 = Rand2(pow(2, 10))
for i in range(0, 10):
print rnd2.rand()
但是,就像我说的那样,我并不真正理解你的代码与你的算法有什么关系。我想这里的tl; dr是使用模数运算符而不是位掩码。