【发布时间】:2018-07-13 12:40:31
【问题描述】:
由于1000000 不是 2 的幂,从 0 到 999999 随机生成精确值的正确方法是什么?
这是我的方法:
- 使用
crypto.randomBytes生成3个字节并转换为hex - 使用前 5 个字符转换为整数(最大值为
fffff==1048575>999999) - 如果结果>
999999,再次从步骤1开始
它会以某种方式创建一个递归函数。它在逻辑上是否正确,是否会引起性能问题?
【问题讨论】:
-
Math.floor(Math.random(1000000)*1000000)
-
我知道,但
math.random不是加密安全的。我的问题是打算使用crypto.randomBytes -
您可以计算分数
YourRandInt/MaxPossible并将其与您的预期范围 (999.999) 相乘,然后四舍五入到下一个整数。不确定这是否会更频繁地产生某些数字。 -
@TobiasK 谢谢,但是我认为这种方法与
YourRandInt % 1000000相同 -
使用模有 x2 的值从 0 到 48575 的机会,我认为使用这种方法不会发生这种情况,因为每个
YourRandInt在 0 和 1 之间都有一个唯一的分数。错误 I认为这可能发生的是你最终得到例如1.1 1.5 1.9 2.3 2.7 3.1 3.5 并且由于四舍五入得到23x 和3仅2x。不过,我既不是数学家也不是密码专家,这只是我的一个想法,因为通常我喜欢Math.random()*range的想法,你只需要安全地生成分数。
标签: node.js algorithm cryptography