给定一个整数范围,如何在该范围内生成一个可被 5 整除的随机整数?
我正在使用 Java
只需生成一个常规随机整数并将其乘以 5!
详细信息:生成一个随机整数,[0, n)
其中n
是您范围内 5 的倍数,然后将其乘以 5 并添加最小的倍数。
单线:( System.out.println(rnd.nextInt(max / 5 - (min + 4) / 5 + 1) * 5 + (min + 4) / 5 * 5);
假设非否定和有效的论点)
学分:(min + 4) / 5 * 5
从这里开始的最低倍数表达式和表达式根据@Thomas(imo 目前不正确)的答案稍微简化了一点
首先创建一个,和Random
四舍五入到最接近的 5 的高/低倍数:low
high
Random r = new Random();
low = ((low+4)/5)*5; // next multiple of 5
high = (high/5)*5; // previous multiple of 5
这可能会使low > high
,这是不可行的,所以不要继续进行;或者它 make may make low == high
,这可能没有任何意义,所以你可能想测试一下。由于 +1 和 -1,下面的代码无论哪种方式都能正常工作:在{low..high}
int randomPart = r.nextInt(high-low+1)+low-1;
然后将其向上舍入为 5 的倍数。先前的恶作剧low
并high
确保它在范围内:
int nextInt = ((randomPart+4)/5)*5;
这个问题要求一个范围内的五的倍数,而不是范围内五的数字。
该解决方案处理否定和范围有效性。
// because Java's % operator doesn't do what one might expect with negatives
int lbound = (min+4) - (((min+4) % 5) + 5) % 5;
int ubound = max - (((max % 5) + 5) % 5);
if (lbound > ubound) {
// do something about the range error
}
if (lbound == ubound) {
return lbound;
}
int range = ((ubound - lbound)/5) + 1;
return ((int)(Math.random() * range) * 5) + lbound;
此方法首先计算给定范围内有多少可被 5 整除的数字。它随机选择一个介于 0 和该计数之间的数字,然后将该随机数乘以 5 并将其添加到下限,从而将该随机数转换回给定范围。
请注意,两者lowerBound
都upperBound
包括在内。
public static int getRandomDivisibleByFive(int lowerBound, int upperBound) {
if (lowerBound > 0) lowerBound += 4;
if (upperBound < 0) upperBound -= 4;
lowerBound /= 5;
upperBound /= 5;
int n = upperBound - lowerBound + 1;
if (n < 1) {
throw new IllegalArgumentException("Range too small");
}
return 5 * (lowerBound + new Random().nextInt(n));
}
在你的值之间选择一个随机数,然后测试它是否可以被 div 整除。如果是,则返回该值,否则它必须进行最大 div-1 次迭代才能获得可被 div 整除的数字。
在您的情况下调用 rBetweenGenerator(min, max, 5)
public int rBetweenGenerator(int min, int max, int div)
{
int res = min + ((new Random()).nextInt(max - min + 1))
for(int i = res; i < res + div; i++)
{
if( i % div == 0 )
{
return i;
}
} return -1; //error
}