Cryptography 有效地生成不同的随机数

Cryptography 有效地生成不同的随机数,cryptography,steganography,Cryptography,Steganography,我的主要目的是在图像的像素上随机有效地分布一个缓冲区,但我一直在生成不同的随机数。我只想生成介于0和N之间的数字,但我也希望这些数字是不同的。还要注意,N通常会非常大,比如2000万,并且算法不必是加密安全的 我不能使用随机洗牌法,因为N相当大。我做了一些搜索,发现了参数m必须是素数,但我的N有时不是素数 最后,我尝试了以下方法,但它不是非常有效和可靠,因为它可能抛出最大调用堆栈大小超过错误 next(最大:个数) { 让num=LCG.next() 如果(num如果数字是不同的,那么它们不是随

我的主要目的是在图像的像素上随机有效地分布一个缓冲区,但我一直在生成不同的随机数。我只想生成介于0N之间的数字,但我也希望这些数字是不同的。还要注意,N通常会非常大,比如2000万,并且算法不必是加密安全的

我不能使用随机洗牌法,因为N相当大。我做了一些搜索,发现了参数m必须是素数,但我的N有时不是素数

最后,我尝试了以下方法,但它不是非常有效和可靠,因为它可能抛出最大调用堆栈大小超过错误

next(最大:个数)
{
让num=LCG.next()

如果(num如果数字是不同的,那么它们不是随机的。随机数字可以重复;不同的数字是从一个不断减少的集合中选择的。这是选择带替换的数字和不带替换的数字之间的区别

您需要从0到2000万的数字。正如您所发现的,这对于洗牌来说太大了。最好使用加密。因为加密是一对一的,只要您有不同的输入,您就会得到不同的输出。只需加密0、1、2、3……您就会得到不同的输出


您谈到使用线性全等PRNG,因此我假设安全性不是很重要。2000万大约是2^24或2^26,因此您可以编写一个简单的四轮大小的密码来完成此工作。或者,使用标准库密码和其中一种方法将输出保持在您想要的范围内。

您不需要你的问题中没有任何重要的细节。与语言无关,也与LCG的参数无关,也与你认为会出现堆栈大小错误的原因无关,也与你在使用简单循环时使用递归的原因无关。但是,只要LCG模数小于2*N,使用LCG解决你所述的问题应该是非常有效的。如果,however,你需要加密质量安全,那么LCG就不够好了。我真的很抱歉不舒服,虽然这不是一个有效的借口,但这是我在网上的第一个问题,我不认为语言或参数有那么重要,但很可能下次会把它们放进去。我确实因为poss而得到了最大的调用堆栈大小错误能够按顺序获得比N大的这么多数字,我不认为循环函数和递归函数在转换为机器代码时有什么区别,但当然这也取决于我没有声明的编程语言,即JavaScript。此外,我不需要加密质量安全性。回答得很好,可能有用在寻找一种算法时,这里的通用工具被称为“伪随机置换”(PRP),其中分组密码是一个具有更强属性的子集。这是一个令人敬畏的答案,同时也很抱歉没有明确说明其密码是否安全——只是更正了它。不过,谢谢,真的。
next(max: number)
{
    let num = LCG.next()
    if (num <= max) return num
    return next(max)
}