我正在寻找一个伪随机数生成器(一种输入种子数的算法,它输出一个不同的'随机查找'数字,同一种子将始终生成相同的输出) 95 1,312,000 。
我会使用Linear Feedback Shift Register (LFSR) PRNG,但是如果我这样做,我将不得不将种子数(基数为10的长度可达120万位)转换为二进制数,这将是如此庞大以至于我认为计算需要很长时间。
对similar question的回应,建议使用Feistel密码,但是我不理解该方法的wiki页面的词汇(我要进入10年级,所以我没有学位加密),所以如果你能使用外行的条款,我会非常感激。
有没有一种有效的方法可以直到时间结束,或者这个问题不可能?
编辑:我忘了提到prng序列需要有一个完整的句号。我的错误。
答案 0 :(得分:0)
如果你有一个可以产生伪随机数字的方法,那么你可以根据需要连接多个。它将与基础prng一样可重复。
但是,您可能会耗尽数百万位数的内存并尝试进行算术运算。通常,那种规模的东西不是在“数字”上完成的。它是在字节向量或类似的东西上完成的。
答案 1 :(得分:0)
执行此操作的一种简单方法是使用模数为import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
的{{3}}。
生成器的公式为m = 95^1312000
。根据Hull-Dobell定理,当{且仅x_(n+1) = a*x_n + c (mod m)
和gcd(m,c) = 1
除95
时,它将具有完整的句点。此外,如果你想要很好的第二个值(在种子之后),即使对于非常小的种子,a-1
和a
也应该相当大。此外,您的代码不能存储这些值作为文字(它们会太大)。相反,您需要能够在运行中可靠地生成它们。经过一些试验和错误以确保c
后,我点击了:
gcd(m,c) = 1
例如:
import random
def get_book(n):
random.seed(1941) #Borges' Library of Babel was published in 1941
m = 95**1312000
a = 1 + 95 * random.randint(1, m//100)
c = random.randint(1, m - 1) #math.gcd(c,m) = 1
return (a*n + c) % m
显示" book"的最后100位数字。数字42.鉴于Python内置了对大整数的支持,代码运行速度惊人(在我的机器上拿一本书需要不到1秒)