Random 从O(1)空间和时间中的随机访问查找键确定地生成随机查找数

Random 从O(1)空间和时间中的随机访问查找键确定地生成随机查找数,random,Random,我想根据输入输出看起来随机的数字。如果输入相同,则给出相同的输出 我不想预生成和存储一堆随机数据,也不想花费O(n)的时间来恢复第n个索引 它不需要是安全的、加密的或其他的,只要看起来是随机的就足够了。如果你想要一个从(索引,长度)对到随机的字节字符串的确定性随机访问函数,你可以使用SHA3-N(索引)[:length]其中N是第一个大于length的方便数字 这与实际数组的行为不同,因为读取索引1(长度为10)和5(长度为10)不会有任何重叠(这是您从数组中期望的) 这将是缓慢的,并且对于N>

我想根据输入输出看起来随机的数字。如果输入相同,则给出相同的输出

我不想预生成和存储一堆随机数据,也不想花费O(n)的时间来恢复第n个索引


它不需要是安全的、加密的或其他的,只要看起来是随机的就足够了。

如果你想要一个从(索引,长度)对到随机的字节字符串的确定性随机访问函数,你可以使用
SHA3-N(索引)[:length]
其中N是第一个大于length的方便数字

这与实际数组的行为不同,因为读取索引1(长度为10)和5(长度为10)不会有任何重叠(这是您从数组中期望的)

这将是缓慢的,并且对于N>512非常不方便,所以如果您需要更长的字符串,您将需要执行多轮。类似于SHA3-512(SHA3-512(索引)[0:256])++SHA3-512(SHA3-512(索引)[256:512])的内容可以获得1024字节的长度

使用多轮部分,您可以使用任何可能更方便的哈希函数(例如SHA256、MD5)


我应该注意到,这绝对是不安全的,而且输出很容易被对手预测。

通常,随机数生成器会。例如,此类python代码可能如下所示:

random.seed(1)
for i in range(1, 10):
    print(random.randint(1,100)
将打印相同的列表,无论您调用该代码多少次。同样,这也将:

random.seed(42)
for i in range(1, 10):
    print(random.randint(1,100)

如果以某种方式将数组的各个部分描述为种子(实际上可以使用哈希函数来实现这一点)您可以使用该值为生成器设置种子,并可靠地允许动态调整所请求列表的大小。

您希望将这些存储在何处/如何存储数据库工作?为什么要存储随机数而不是返回下一个随机数?确切地说,我不想存储整个数组,如果需要随机访问、确定性、外观混乱的数据,那么我建议使用散列函数,而不是存储任何内容。