在特定范围内生成随机 LocalTime

generate random LocalTime in a specific range

我有两个 LocalTime 对象:

LocalTime time1 = LocalTime.of(8, 0, 0);
LocalTime time2 = LocalTime.of(15, 0, 0);

我想在这两个对象之间生成一个随机的 LocalTime 对象。

我已经尝试过 rand.nexInt()

Random rand = new Random();

int hours = rand.nextInt((time2.getHour() - time1.getHour()) + 1) + time1.getHour();
int minutes =  rand.nextInt((time2.getMinute() - time1.getMinute()) + 1) + time1.getMinute();
int seconds = rand.nextInt((time2.getSecond() - time1.getSecond()) + 1) + time1.getSecond(); 

LocalTime random = LocalTime.of(hours,minutes,seconds);

但只会生成像 9:00:00 这样的完整小时数。

首先检查 time2time1 之后。
然后,您可以将 LocalTime 实例转换为 long 表示当天的秒数(LocalTime.toSecondOfDay() 方法就是这样做的),然后在当天的秒数之间选择一个随机数两个 LocalTime 个实例中的一个,并使用 LocalTime.ofSecondOfDay() 创建随机 LocalTime

LocalTime time1 = LocalTime.of(8, 0, 0);
LocalTime time2 = LocalTime.of(15, 0, 0);
int secondOfDayTime1 = time1.toSecondOfDay();
int secondOfDayTime2 = time2.toSecondOfDay();
Random random = new Random();
int randomSecondOfDay = secondOfDayTime1 + random.nextInt(secondOfDayTime2-secondOfDayTime1);   
LocalTime randomLocalTime = LocalTime.ofSecondOfDay(randomSecondOfDay);

请注意,在Random.next(int bound) 中,bound 值是唯一的。因此,如果重要,您应该增加一秒钟以包括可能范围内的最后一个值,例如:

int randomSecondOfDay = 
secondOfDayTime1 + random.nextInt(secondOfDayTime2-secondOfDayTime1 + 1);    
long totalNanos = Math.abs(ChronoUnit.NANOS.between(time1, time2));
long randomNanos = ThreadLocalRandom.current().nextLong(totalNanos);
LocalTime firstTime = time2.isAfter(time1) ? time1 : time2;
LocalTime randomTime = firstTime.plusNanos(randomNanos);
System.out.println(randomTime);

当我运行刚才的代码时,它打印了

14:29:55.815373666

如果你希望它不那么细粒度,你可以用毫秒或秒、分钟甚至小时来做类似的事情。我使用 ThreadLocalRandom 的原因是它在一定范围内提供了 运行dom。对于毫秒或更长时间,您可以转换为 int 并根据需要使用标准 Random class。

我假设了一个半开区间,也就是说,结果有时(很少)等于 time1 而永远不会等于 time2。如果你想要别的东西,我可以让你在正确的地方加或减 1 吗? 也处理这个问题。