我正在努力完成实用程序方法以生成 2 个整数范围内的数字,该数字也是另一个整数的乘数。
例如:
public static void main(String[] args) {
getIntegerInRangeMultipleOf(100, 1000, 444);
}
应该产生 444 或 888。没有别的。
我想出了这个解决方案:
public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + minInclusive) / multiplier) * multiplier);
}
但对于上面的示例,除了 444 和 888 之外,它有时还会产生 0(零)。
请建议如何修复该功能。
最佳答案
我认为您可以稍微简化一下数学运算。让我们创建一个最小乘数和一个最大乘数。
如果 minInclusive
小于(或等于)multiplier
,那么我们知道可以将 minMultiplier
设置为 1
。否则,它等于 multiplier
的下一个大于 minInclusive
的倍数除以 multiplier
。
maxInclusive
始终必须大于(或等于)multiplier
,因此我们可以将 maxMultiplier
设置为 maxInclusive/multiplier
。
然后,我们只需将 multiplier
乘以一个介于 minMultiplier
和 maxMultiplier
之间的随机数,包括两端:
public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
int minMultiplier = minInclusive <= multiplier ? 1 : (int) Math.ceil((double) minInclusive / multiplier);
int maxMultiplier = maxInclusive / multiplier;
return multiplier * ThreadLocalRandom.current().nextInt(minMultiplier, maxMultiplier + 1);
}
我已经用许多不同范围的正数对此进行了测试,它似乎工作得很好。
关于java - 在Java中生成另一个整数范围倍数的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547699/