Python 超大(10^1.2mil)数的伪随机算法?

Python 超大(10^1.2mil)数的伪随机算法?,python,algorithm,random,Python,Algorithm,Random,我正在寻找一个伪随机数生成器(一种算法,您输入一个种子数,它输出一个不同的“随机”数,同一个种子将始终生成相同的输出),用于1到951312000之间的数字 我会使用PRNG,但如果我这样做了,我将不得不将种子数(以10为基数最多可达120万位)转换为二进制数,这将是如此巨大,以至于我认为计算起来会花费太长时间 作为对a的回应,建议使用Feistel密码,但我不了解wiki页面中该方法的词汇表(我要上10年级,所以我没有加密学位),因此如果你能使用外行术语,我将非常感激 有没有一种有效的方法可以

我正在寻找一个伪随机数生成器(一种算法,您输入一个种子数,它输出一个不同的“随机”数,同一个种子将始终生成相同的输出),用于1到951312000之间的数字

我会使用PRNG,但如果我这样做了,我将不得不将种子数(以10为基数最多可达120万位)转换为二进制数,这将是如此巨大,以至于我认为计算起来会花费太长时间

作为对a的回应,建议使用Feistel密码,但我不了解wiki页面中该方法的词汇表(我要上10年级,所以我没有加密学位),因此如果你能使用外行术语,我将非常感激

有没有一种有效的方法可以做到这一点,而这种方法要到时间的尽头才能实现,或者这个问题是不可能的


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

如果你有一种方法可以产生一个伪随机数字,那么你可以将任意多的数字连接在一起。它将与基础prng一样具有可重复性


但是,如果将其扩展到数百万位并尝试进行算术运算,可能会耗尽内存。通常情况下,这种规模的东西不是在“数字”上完成的。它是在字节向量或类似的东西上完成的。

一个简单的方法是使用一个带模的函数
m=95^1312000

生成器的公式是
x_u(n+1)=a*x_un+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 = get_book(42)
>>> book % 10**100
4779746919502753142323572698478137996323206967194197332998517828771427155582287891935067701239737874

显示“book”编号42的最后100位数字。考虑到Python内置的对大整数的支持,代码运行速度惊人(在我的机器上抓取一本书不到1秒)

欢迎来到SO:)我没有否决投票,但我想你这么做是出于以下原因之一:(1)这个问题中有太多无关的信息,即使你“隐藏”了它,(2)这就像你问了一大堆问题,所以不清楚你到底想要什么,这让我觉得(3)你问一个问题很痛苦。试着编辑你的问题,使之符合a的社区标准,这样会更容易得到帮助。澄清一下-我不相信你需要一个随机数生成器,你对你实际尝试做的事情的解释非常令人困惑是的,请将其浓缩到你需要解决的问题。试着写一篇关于库问题的简明描述,然后简要描述您当前的研究和实现问题。简言之,为什么,然后是如何。如果你需要生成一个260万位数的随机数,那可能是一个好时机来扭转局面,找出你错在哪里。是的;你只需要一个很长的数字。很长的数字只是数据。您可以使用任意随机数生成器创建任意长度的数字。一部2小时长的MPEG电影只是一个“数字”,碰巧是一个非常大的数字。所以这里没什么复杂的。你不需要专门的系统。只需为随机数生成器设定种子并运行它,直到获得所需的“数字”大小。一般选择的RNG在连接到如此大的数字时不会具有足够的随机性。前M个数字将唯一地表示剩余的M-N,其中N>>M。我认为这是可以的,因为问题表明LFSR将是合适的,它将具有相同的属性。这是一个非常好的观点。然而,在问题中,我忘了提到prng序列需要有一个完整的周期(我的坏)。连接方法是否可以工作并仍然产生一个完整的周期?这取决于您使用的算法。一般用途的PRNG通常没有那么强大。我们如何保证
c
m
除了1之外没有共同的因素?似乎如果
c
可以是
1
m-1
之间的任何数字,
c
可能与
m
至少共享一个公因子。另外,非常感谢你的邀请reponse@IkeBishop
c
是一个特定的数字,由种子决定(1941年,在百灵鸟身上选择)。我首先使用
math.gcd()
,用
m
测试它是相对素数,尽管它足以检查
c%5
c%19
都不是零。是的,我错误地认为
c
a
在每次运行代码时都是不同的,但你是正确的。我觉得很好,故事发表的那一年恰好是一粒种子,为LCG创造了一个完整的时期。非常聪明,谢谢!