java - Java Random.nextInt() 行为
问题描述
出于好奇,我编写了这个简单的代码,并遇到了 Java Random 类中 nextInt() 方法的一些我不太理解的行为。谁能帮我弄清楚?
该程序模拟一个简单的硬币翻转。据我了解,对于小于和大于 49 的数字,nextInt(101) 的概率应该相等。
但是只要我增加迭代次数,余额就会趋于正数,例如在 100,000 次迭代后,我没有得到负数。为什么会这样?
public static void main(String[] args) {
int balance = 0;
for (int i = 0; i < 100000; i++) {
Random random = new Random();
int result = random.nextInt(101);
if (result > 49) {
balance++;
} else {
balance--;
}
}
System.out.println("Player's balance = " + balance);
}
解决方案
您调用int result = random.nextInt(101)
which 在 [0,100] 中创建均匀分布的整数,它可以采用 101 个不同的值。如果你检查if (result > 49)
,那么你有 51 个可能的值 ([50,100]),否则你只有 50 个值 ([0,49])。因此,结果更有可能出现在上半部分。要修复它,您可以这样做int result = random.nextInt(100)
。
推荐阅读
- parsing - FParsec 和 pipe3 使参数显式或添加类型表示法
- javascript - 将一个组件的值传递给另一个 Angular
- c# - 找不到文件时由应用程序处理的自定义错误页面
- matlab - 如何使用 MATLAB 在 50 个连续值后分隔文本文档中的 0 和 1
- java - 当移动设备没有任何互联网时,无法从 url 获取 favicon,或者是否可以保存在内部存储中,然后从那里读取
- kdb - 如何使用 each 将变量集传递给 q 中的函数
- php - 如何从数组内部的数组中查找值?
- android - 更新后 Android Studio SDK 安装问题
- ios - 保存主对象上下文时 CoreData 崩溃
- tsql - 在 SQL 中将一行拆分为具有最大列值的多行