非常大(10 ^ 1.2mil)数的伪随机算法?

时间:2017-08-01 22:28:18

标签: python algorithm random

我正在寻找一个伪随机数生成器(一种输入种子数的算法,它输出一个不同的'随机查找'数字,同一种子将始终生成相同的输出) 95 1,312,000

我会使用Linear Feedback Shift Register (LFSR) PRNG,但是如果我这样做,我将不得不将种子数(基数为10的长度可达120万位)转换为二进制数,这将是如此庞大以至于我认为计算需要很长时间。

similar question的回应,建议使用Feistel密码,但是我不理解该方法的wiki页面的词汇(我要进入10年级,所以我没有学位加密),所以如果你能使用外行的条款,我会非常感激。

有没有一种有效的方法可以直到时间结束,或者这个问题不可能?

编辑:我忘了提到prng序列需要有一个完整的句号。我的错误。

2 个答案:

答案 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) = 195时,它将具有完整的句点。此外,如果你想要很好的第二个值(在种子之后),即使对于非常小的种子,a-1a也应该相当大。此外,您的代码不能存储这些值作为文字(它们会太大)。相反,您需要能够在运行中可靠地生成它们。经过一些试验和错误以确保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秒)