节点:使用crypto.randomBytes生成6位数的随机数

wde*_*tac 4 algorithm cryptography node.js

什么是从生成精确值的正确方法0,以999999随机,因为1000000不是2的幂?

这是我的方法:

  1. 用于crypto.randomBytes生成3个字节并转换为hex
  2. 使用前5个字符转换为整数(最大值为fffff== 1048575> 999999
  3. 如果结果> 999999,则再次从步骤1开始

它将以某种方式创建递归函数。在逻辑上是否正确,是否会引起性能问题?

Maa*_*wes 6

有几种方法可以从随机位中提取一定范围内的随机数。NIST特殊出版物800-90A修订版1中介绍了一些常见的方法:使用确定性随机位生成器生成随机数的建议

尽管此标准是关于确定性随机位生成的,但是有一个有用的附录称为A.5将随机位转换为随机数,其中描述了三种有用的方法。

描述的方法是:

  • A.5.1简单丢弃方法
  • A.5.2复杂丢弃方法
  • A.5.3简单模块化方法

它们中的前两个不是确定性的,而是生成没有偏差的数字。它们基于拒绝采样。最后一个是时间常数和确定性的,但具有非零(但可以忽略)的偏差。但是,需要相对大量的额外随机性才能实现可忽略的偏差。

您的算法显然是“简单丢弃方法”的一种版本,因此很好。


当然,您应该使用通用方法,只要赋予的任何值,该方法都是有效的N。在这种情况下,应考虑在简单丢弃方法上考虑复杂丢弃方法或简单模块化方法。还有其他更复杂的算法甚至更有效,但是使用这两种方法中的任何一种通常都可以。

请注意,N在生成范围内的随机数时,首先检查是否为2的幂通常是有益的[0, N)。如果N 为2的幂,则无需使用任何可能昂贵的计算;否则,无需计算。只需使用随机位或字节生成器中所需的位即可。