以下代码是否会生成带或不带偏差的随机数?
int numberToGenerate = 20;
int rangeUpperLimit = 30;
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
for (int i = 0; i < numberToGenerate; i++) {
int randomInt = random.nextInt(rangeUpperLimit);
// Do something with it.
}
这些值用于从长度为30的chars
中选择String
,因此范围为0-29。省略了选择char
值的代码,因为它与问题无关。
答案 0 :(得分:3)
肯定意味着是一个统一的分布(因此没有偏见)。来自the documentation:
从此随机数生成器的序列中返回一个伪随机,均匀分布的int值,介于0(包括)和指定值(不包括)之间。
这假设生成器序列是好的,但我认为这是一个合理的假设,特别是考虑到SecureRandom
的文档:
加密强随机数最低限度符合FIPS 140-2“加密模块的安全要求”第4.9.1节中规定的统计随机数生成器测试。
如果您担心偏见,检查任何特定的运行都会相当容易 - 生成(比方说)三千万个值,跟踪您获得每个数字的次数,并查看它与一个数字的接近程度每桶数百万。
答案 1 :(得分:-1)
结果 应该<{3}}定义,但在您的示例中,您不使用种子来初始化PNRG,因此可能存在偏差