根据条件生成两次随机范围内的时间

时间:2019-11-05 19:04:59

标签: java java-8 localtime

我正在尝试在两次的范围内生成10次随机时间,并且有一个条件,即所产生的时间之间的时间不能少于30分钟。因此,如果我开始于10:00 am,结束于05:00 pm,则它们之间的时间必须至少相隔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个

3 个答案:

答案 0 :(得分:4)

为了获得良好的随机分布:从10:00开始到17:00结束之间的7小时内(在24小时制,“军事时间”),您已经预留了4小时30分钟最小间隙(最少30分钟9个间隙)。因此,从7中减去4:30,就可以得到2小时30分钟的自由度。

  1. 例如在2小时30分钟内随机产生10次。
  2. 按时间顺序对它们进行排序。
  3. 第一次添加0分钟,第二次添加30分钟,第三次添加1小时,依此类推。因此,您将在最后一次添加4小时30分钟。这样可以确保每个间隔至少有30分钟,并且最后一次间隔仍在17:00结束时间内。

快乐的编码。

答案 1 :(得分:1)

您可以在isBefore中使用LocalTime,因此请选中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;
    }
  }

答案 2 :(得分:0)

您无法使用计算机生成真正的随机数,因此您始终必须采取一些策略。而且,如果您的数字确实是随机的,那么他们就不会互相了解。因此,您不能分开分别产生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;
}