3

给定一个整数范围,如何在该范围内生成一个可被 5 整除的随机整数?

我正在使用 Java

4

5 回答 5

6

只需生成一个常规随机整数并将其乘以 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 目前不正确)的答案稍微简化了一点

于 2013-10-13T02:30:02.023 回答
1

首先创建一个,和Random四舍五入到最接近的 5 的高/低倍数:lowhigh

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 的倍数。先前的恶作剧lowhigh确保它在范围内:

int nextInt = ((randomPart+4)/5)*5;
于 2013-10-13T09:19:18.890 回答
1

这个问题要求一个范围内的五的倍数,而不是范围内五的数字。

该解决方案处理否定和范围有效性。

    // 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;
于 2013-10-13T02:44:43.600 回答
0

此方法首先计算给定范围内有多少可被 5 整除的数字。它随机选择一个介于 0 和该计数之间的数字,然后将该随机数乘以 5 并将其添加到下限,从而将该随机数转换回给定范围。

请注意,两者lowerBoundupperBound包括在内。

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));
}
于 2013-10-13T19:39:50.293 回答
-3

在你的值之间选择一个随机数,然后测试它是否可以被 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
}
于 2013-10-13T02:26:03.940 回答