高效生成不同的随机数

问题描述 投票:0回答:1

我的主要目的是将缓冲区随机有效地分布在图像的像素上,但我在生成 鲜明 随机数。我只是想在 0N但我也希望这些数字是不同的。还请注意 N 通常会相当大,比如2000万,算法不一定要加密安全。

我不能用随机洗牌法,因为N相当大。我搜索了一下,发现 线性同调发生器 但参数 m 是需要质数的,但我的N有时不是。

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

next(max: number)
{
    let num = LCG.next()
    if (num <= max) return num
    return next(max)
}
cryptography steganography
1个回答
1
投票

如果数字是独特的,那么它们就不是随机的。 随机数可以重复,独特的数字是从一个不断减少的集合中选出来的。 这就是选择有替换和无替换的数字之间的区别。

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

你说的是使用线性同构PRNG,所以我认为安全性不是很重要。 2000万大约是2^24或2^26,所以你可以写一个简单的四轮的 飞斯特尔密码 适当的大小来完成工作。 或者,使用标准的库密码与其中的一个 保存格式 方法来保持输出在你想要的范围内。

© www.soinside.com 2019 - 2024. All rights reserved.