我正在尝试在两次的范围内生成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个
答案 0 :(得分:4)
为了获得良好的随机分布:从10:00开始到17:00结束之间的7小时内(在24小时制,“军事时间”),您已经预留了4小时30分钟最小间隙(最少30分钟9个间隙)。因此,从7中减去4:30,就可以得到2小时30分钟的自由度。
快乐的编码。
答案 1 :(得分:1)
您可以在isBefore
中使用LocalTime
,因此请选中startTime+30 Min is before result
和result 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;
}