有条件生成两倍范围内的随机时间

Generate random time within a range of two times with condition

我想在两次范围内生成10个随机时间,并且有一个条件是生成的时间之间不能少于30分钟。因此,如果我从 10:00am 开始并在 05:00pm 结束,它们之间的时间间隔必须至少为 30 分钟。

我已经可以得到随机时间,但不知道如何将条件放在那里,有什么想法吗?

public LocalTime between(LocalTime startTime, LocalTime endTime) {
    int startSeconds = startTime.toSecondOfDay();
    int endSeconds = endTime.toSecondOfDay();
    int randomTime = ThreadLocalRandom
      .current()
      .nextInt(startSeconds, endSeconds);

    return LocalTime.ofSecondOfDay(randomTime);
}

我把它放在一个 for 循环中以获得其中的 10 个

您可以在 LocalTime 中使用 isBefore,因此检查 startTime+30 Min is before resultresult is before endTime-30 Min

LocalTime result = LocalTime.ofSecondOfDay(randomTime);   

if (startTime.plusMinutes(30).isBefore(result) && result.isBefore(endTime.minusMinutes(30))) {
    return result;
}

可能你可以使用while循环来循环直到得到有效结果

while(true) {

  LocalTime result = LocalTime.ofSecondOfDay(ThreadLocalRandom. current().nextInt(startSeconds, endSeconds));   

if (startTime.plusMinutes(30).isBefore(result) && result.isBefore(endTime.minusMinutes(30))) {
    return result;
    }
  }

为了良好的随机分布:在 10:00 开始和 17:00 结束之间的 7 小时内(24 小时制,“军事时间”),4 小时 30分钟已经预留给您的最小间隙(9 间隙 @ 最少 30 分钟)。所以从 7 中减去 4:30,这给出了 2 小时 30 分钟的自由。

  1. 在 2 小时 30 分钟内生成 10 个随机时间,例如您已经这样做的方式。
  2. 按时间顺序排列。
  3. 第一次加 0 分钟,下一次加 30 分钟,第三次加 1 小时,依此类推。最后一次加 4 小时 30 分钟。这将确保每次间隔至少 30 分钟,并且最后一次仍在 17:00 结束时间内。

你不能用计算机产生真正的随机数,你总是要有一些策略。如果你的号码真的是随机的,那么他们就不会知道彼此。所以,你不能单独生成真正随机的时间间隔 30 分钟。你必须一起生成它们。你必须找到一个最小距离。并且开始时间和结束时间必须有足够的距离来产生你想要的随机次数。

如果它们有足够的距离,您可以通过以下方法在任何给定范围内生成任意数量的随机时间 -


public List<LocalTime> generateRandomTimes(LocalTime startTime, LocalTime endTime, int n) {

    if (n < 0) {
        throw new RuntimeException("Must be greater than zero");
    }

    List<LocalTime> localTimeList = new ArrayList<>();

    int startSeconds = startTime.toSecondOfDay();
    int endSeconds = endTime.toSecondOfDay();

    int minimumDistance = LocalTime.of(0, 30).toSecondOfDay();
    int standardDistance = (endSeconds - startSeconds) / n;

    if (standardDistance <= minimumDistance) {
        throw new RuntimeException("Not enough time distance to generate the required number of random times");
    }

    int randomRange = (endSeconds - (n * minimumDistance)) / n;

    for (int i = 1; i <= 10; i++) {
        int nextInt = ThreadLocalRandom
                .current()
                .nextInt(startSeconds, startSeconds + randomRange);

        LocalTime time = LocalTime.ofSecondOfDay(nextInt);
        localTimeList.add(time);

        startSeconds = nextInt + minimumDistance;
    }

    return localTimeList;
}