【问题标题】:How do you generate a random integer in a specified range, divisible by 5? [closed]如何生成指定范围内的随机整数,可被 5 整除? [关闭]
【发布时间】:2013-10-13 02:00:51
【问题描述】:

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

我正在使用 Java

【问题讨论】:

  • 你有没有尝试过?
  • 我可以使用以下命令生成一个随机数:random.nextInt(max - min) + min;但是,我不知道如何使随机生成的整数可以被 5 整除。
  • 你想过除法和乘法吗?还是您选择在这里提问?
  • 所以如果范围是 [3,7] 那么你能生成的唯一数字是 5?
  • 如果范围是[1,4],你的程序应该怎么做?

标签: java random integer


【解决方案1】:

只需生成一个常规的随机整数并将其乘以 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 来自 here 和表达式根据 @Thomas 的(imo 目前不正确)的答案简化了一点

【讨论】:

  • “找到最小的倍数和计数很棘手.. 留给读者做练习”——很有趣,但是——不,我不认为那样会做。
  • 不是我的,也不知道为什么。但是 oneliner 难以阅读。介意一些格式吗?
  • @JanDvorak 简化 + 操作与口头描述一致
【解决方案2】:

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

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

    // 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;

【讨论】:

  • 为什么不直接使用if(lbound > ubound) 进行错误检测?
【解决方案3】:

首先创建一个Random,并将lowhigh 分别舍入到最接近的5 的高/低倍数:

Random r = new Random();
low = ((low+4)/5)*5;    // next multiple of 5
high = (high/5)*5;  // previous multiple of 5

这可能会导致low > high,这是不可行的,所以不要再继续了;或者它可能会生成low == high,这可能没有任何意义,因此您可能需要对此进行测试。下面的代码无论哪种方式都可以正常工作,因为 +1 和 -1: generate a random number in {low..high}

int randomPart = r.nextInt(high-low+1)+low-1;

然后将其向上舍入为 5 的倍数。之前带有 lowhigh 的恶作剧确保它在范围内:

int nextInt = ((randomPart+4)/5)*5;

【讨论】:

  • 这实际上是行不通的。
  • 你试过了吗?如果低 = 14 高 = 16 会怎样?
  • 完全修改了 ;-)
【解决方案4】:

此方法首先计算给定范围内有多少可被 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));
}

【讨论】:

    【解决方案5】:

    在你的值之间选择一个随机数,然后测试它是否可以被 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
    }
    

    【讨论】:

    • 我很确定如果不能被 5 整除,则不应该返回范围边界
    • 哎呀,我以为我之前看到了一个关于 [3,7] 返回固定 3 5 或 7 的问题。
    • 呃……你为什么要返回 -1 错误?如果发生错误,您应该抛出异常。
    • 如果您的初始 res 高于 5 的最大有效倍数,那么您将返回一个大于 max 的数字。
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 2015-10-24
    • 2018-12-17
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多