Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于散列的伪随机数生成器,可用于任何大小的表_Python_Hash_Random - Fatal编程技术网

Python 用于散列的伪随机数生成器,可用于任何大小的表

Python 用于散列的伪随机数生成器,可用于任何大小的表,python,hash,random,Python,Hash,Random,我正在构造一个用于散列的伪随机数生成器。我需要使用的算法如下: 每次调用tabling例程时,将整数R初始化为等于1 在每次连续调用随机数时,设置R=R*5 屏蔽除低阶n+2位外的所有乘积,并将结果放入R中 设置P=R/4并返回 到目前为止,这是一个适用于2^n大小的表的功能,但是如何更改它,使其可以容纳任何大小的表 def rand(size,i) n = math.log(size,2) r = 1 random_list = []

我正在构造一个用于散列的伪随机数生成器。我需要使用的算法如下:

每次调用tabling例程时,将整数R初始化为等于1 在每次连续调用随机数时,设置R=R*5 屏蔽除低阶n+2位外的所有乘积,并将结果放入R中 设置P=R/4并返回 到目前为止,这是一个适用于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]

我真的不明白你的代码和你的算法有什么关系什么是随机列表?或者应该如何构造代码,但我假设它与以下内容类似:

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这里使用的是模运算符而不是位掩码。

为什么不使用现有的哈希函数?