在特定范围内生成随机 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
这样的完整小时数。
首先检查 time2
在 time1
之后。
然后,您可以将 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 吗? 也处理这个问题。
我有两个 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
这样的完整小时数。
首先检查 time2
在 time1
之后。
然后,您可以将 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 吗?