java - 在Java中生成另一个整数范围倍数的随机整数

标签 java algorithm random integer

我正在努力完成实用程序方法以生成 2 个整数范围内的数字,该数字也是另一个整数的乘数。

例如:

public static void main(String[] args) {
    getIntegerInRangeMultipleOf(100, 1000, 444);
} 

应该产生 444888。没有别的。

我想出了这个解决方案:

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + minInclusive) / multiplier) * multiplier);
}

但对于上面的示例,除了 444888 之外,它有时还会产生 0(零)。

请建议如何修复该功能。

最佳答案

我认为您可以稍微简化一下数学运算。让我们创建一个最小乘数和一个最大乘数。

如果 minInclusive 小于(或等于)multiplier,那么我们知道可以将 minMultiplier 设置为 1。否则,它等于 multiplier 的下一个大于 minInclusive 的倍数除以 multiplier

maxInclusive 始终必须大于(或等于)multiplier,因此我们可以将 maxMultiplier 设置为 maxInclusive/multiplier

然后,我们只需将 multiplier 乘以一个介于 minMultipliermaxMultiplier 之间的随机数,包括两端:

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/

相关文章:

java - 使android listview布局可滚动

java - 具有可比接口(interface)的 equals 方法契约

java - 设置种子以确定性地在 Java 中随机播放 ArrayList

java - pdfBox 查找包含签名字段的页号

algorithm - 替换嵌套循环的设计模式

c - 如果 Arduino 的库有 32 位限制,我如何在 Arduino 上输出 64 位数字?

string - 这个字符串操作代码的空间复杂度是多少?

java - 生成一个大于或小于前一个随机数的随机数

java - 仅检索包含 System.out.print 的方法的返回值

java - 如何为历史日期运行oozie?