2

の値より大きいランダムな値を生成する方法System.currentTimeInMillis()。object.howを使用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

これは、オブジェクト作成のリアルタイムを取得するのに役立つ場合があり、2 つのオブジェクトが同じタイムスタンプを持つことはできないため、それらを順序付けることができます。

オブジェクトの 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 を掛けると、ナノ秒の精度で 1 秒の経過時間が得られます。

日付を読むには: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 に答える
1

currentTimeMillisとの間の時間の均一な分布については、Long.MAX_VALUEoverflowを使用せずに、次を使用できます。

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