首页 > 解决方案 > 有效地生成不同的随机数

问题描述

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

我不能使用随机洗牌方法,因为 N 很大。我做了一些搜索,发现线性同余生成器,但参数m必须是素数,但我的 N 有时不是。

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

next(max: number)
{
    let num = LCG.next()
    if (num <= max) return num
    return next(max)
}

标签: cryptographysteganography

解决方案


如果数字不同,则它们不是随机的。随机数可以重复;从不断减少的集合中选择不同的数字。这是选择有替换和没有替换的数字之间的区别。

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

您谈到使用线性同余 PRNG,所以我认为安全性并不重要。2000 万大约是 2^24 或 2^26,因此您可以编写一个大小合适的简单四轮Feistel 密码来完成这项工作。或者,使用具有格式保留方法之一的标准库密码将输出保持在您想要的范围内。


推荐阅读