cryptography - 有效地生成不同的随机数
问题描述
我的主要目的是随机有效地将缓冲区分布在图像的像素上,但我一直坚持生成不同的随机数。我只是想要生成0和N之间的数字,但我也希望这些数字是不同的。另请注意,N通常会很大,例如 2000 万,并且算法不必是密码安全的。
我不能使用随机洗牌方法,因为 N 很大。我做了一些搜索,发现线性同余生成器,但参数m必须是素数,但我的 N 有时不是。
最后,我尝试了以下方法,但它不是很有效和可靠,因为它可能会抛出最大调用堆栈大小超出错误。
next(max: number)
{
let num = LCG.next()
if (num <= max) return num
return next(max)
}
解决方案
如果数字不同,则它们不是随机的。随机数可以重复;从不断减少的集合中选择不同的数字。这是选择有替换和没有替换的数字之间的区别。
您需要从 0 到 2000 万的数字。正如您所发现的,这对于洗牌来说太大了。最好使用加密。因为加密是一对一的,只要你有不同的输入,你就会得到不同的输出。只需加密 0, 1, 2, 3, ... 你就会得到不同的输出。
您谈到使用线性同余 PRNG,所以我认为安全性并不重要。2000 万大约是 2^24 或 2^26,因此您可以编写一个大小合适的简单四轮Feistel 密码来完成这项工作。或者,使用具有格式保留方法之一的标准库密码将输出保持在您想要的范围内。
推荐阅读
- dart - 意外的迭代器函数和 Iterable.take 行为
- vue.js - Vuex 数据渲染的问题
- python-3.x - 如何使在 Sublime Text 中运行 Python 3 脚本响应?
- laravel - 使用 proengsoft/laravel-jsvalidation 我在 Windows php7.4 下得到“传递给的参数 2 必须是数组类型”
- android - 使用视图绑定显示空白屏幕
- javascript - how to push arr2d in arr2d in javascipt
- environment-variables - Get User Home Folder in Haxe
- python - Dijkstra 的最短路径
- python - Keras - How to get only one tensor from a batch of tensors?
- c++ - 在将本地文件写入网络时流式传输本地文件的高性能方式