2

如何生成大于 的值的随机值System.currentTimeInMillis()。我使用Random对象。如何获得最小范围为的值System.currentTimeInMillis()

4

4 回答 4

8

long value = System.currentTimeMillis() + (long)random.nextInt(range);

工作?

如果您要强制执行一个严格大于的值,请在其中System.currentTimeMillis()添加一个额外的 1。相应地设置范围以防止溢出(请参阅assylias的评论)。

根据评论编辑。

于 2012-07-13T12:30:25.590 回答
1

对于currentTimeMillis和之间的时间均匀分布Long.MAX_VALUE没有溢出,您可以使用:

long time = System.currentTimeMillis();
long randomFutureTime = Math.abs(random.nextLong()) % (Long.MAX_VALUE - time) + time;
于 2012-07-13T12:46:41.317 回答
1

这对于实时创建对象很有用,并且两个对象不能具有相同的时间戳,因此您可以对它们进行排序。

我将对象用作 UUID:

Const.DECAL_BIT = 20;
Const.DECAL_BIT_MASQUE = (Long.size() -1) -  next 20;

private final Long timeCreate = (System.currentTimeMillis() << Const.DECAL_BIT) 
       + (System.nanoTime() & Const.DECAL_BIT_MASQUE);

因此,您可以拥有 100 年的有效日期:您将内部日期时间乘以 1M,并以纳秒精度获得一秒的经过时间。

阅读日期:Date d = Date((Long) timeCreate>> Const.DECAL_BIT);

于 2012-07-13T12:47:35.187 回答
1

如果您希望能够获得分布在整个范围内的数字,这是一种方法System.currentTimeMillis()..Long.MAX_VALUE

long millis = System.currentTimeMillis();    
long l = Math.min(Long.MAX_VALUE - millis, Math.abs(random.nextLong())) + millis;

Long.MAX_VALUE 将比这里的其他结果更常见,以防万一。

于 2012-07-13T12:37:13.383 回答