将PRNG的结果拟合到最大最小范围

时间:2016-10-13 01:59:48

标签: java

我正在使用Java Diehard随机性测试套件(https://sourceforge.net/projects/jrandtest/)中的PRNG。所有算法都有3种方法来检索随机数:

readByte()
readInt()
readLong()

运行AES算法的快速循环生成了这些数字:

Byte: -102
 Int: -252497821
Long: 5882262596119081845
Byte: -68
 Int: 1688727157
Long: 436050817787325007

我需要生成0-36(含)范围内的随机整数。没有类具有类似于Random()和SecureRandom()具有的nextInt(int bound)的方法。如何使我从PRNG获得的数字符合我需要的范围?谢谢!

1 个答案:

答案 0 :(得分:0)

天真的方法是取readInt() % myMaxValue的结果,但这会产生偏差的分布,因为它使用生成值的最低有效位(恰好具有最低的熵)。

阅读Random.nextInt(int)的规范,了解它们是如何解决的。当然,the source of openjdk你可以从中获得灵感。