我正在使用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获得的数字符合我需要的范围?谢谢!
答案 0 :(得分:0)
天真的方法是取readInt() % myMaxValue
的结果,但这会产生偏差的分布,因为它使用生成值的最低有效位(恰好具有最低的熵)。
阅读Random.nextInt(int)
的规范,了解它们是如何解决的。当然,the source of openjdk你可以从中获得灵感。