java - 特定时间戳的唯一随机数

标签 java multithreading data-structures

我正在学习 Java 中随机数生成和多线程的概念。

想法是在特定的毫秒内不生成重复的范围为 1000 的随机数(考虑到,不超过 50 个数据,以多线程的方式将在毫秒内处理)。因此在特定时间生成的随机数列表是唯一的。你能告诉我任何想法吗,因为我最终会在特定的毫秒内生成几个重复的随机数(也有相当大的概率)。

我尝试了以下失败的事情。

Random random = new Random(System.nanoTime());
double randomNum = random.nextInt(999);

//

int min=1; int max=999;
double randomId = (int)Math.abs(math.Random()* (max - min + 1) + min);

//

Random random = new Random(System.nanoTime()); // also tried new Random();
double randomId = (int)Math.abs(random.nextDouble()* (max - min + 1) + min);

当我附加正在生成的时间戳时,在多线程环境中,我看到为 5000 多个唯一数据生成(2-4 次)相同的 ID(大约 8-10 个)。

最佳答案

首先,你应该使用new Random(),因为它看起来是like this (具体取决于 Java 版本):

 public Random() { this(++seedUniquifier + System.nanoTime()); }
 private static volatile long seedUniquifier = 8682522807148012L;

即它已经利用了 nanoTime() 确保具有相同 nanoTime() 结果的不同线程获得不同的种子,new Random(System.nanoTime()) 没有。

(编辑:Pyranja 指出这是 Java 6 中的错误,但已修复 in Java 7:

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}

private static long seedUniquifier() {
    // L'Ecuyer, "Tables of Linear Congruential Generators of
    // Different Sizes and Good Lattice Structure", 1999
    for (;;) {
        long current = seedUniquifier.get();
        long next = current * 181783497276652981L;
        if (seedUniquifier.compareAndSet(current, next))
            return next;
    }
}

private static final AtomicLong seedUniquifier
    = new AtomicLong(8682522807148012L);

)

其次,如果你生成 50 个从 1 到 1000 的随机数,由于 the birthday paradox,一些数字相同的概率非常高.

第三,如果你只想要唯一的 id,你可以只使用 AtomicInteger 计数器而不是随机数。或者,如果您想要一个随机部分开始,请附加一个计数器以保证唯一性。

关于java - 特定时间戳的唯一随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19111827/

相关文章:

java - 删除相邻重复字母时的 StringIndexOutOfBounds

java - 我最多只能打印 "red: 1",之后我的程序由于使用 break 语句而结束

java - 如何在 Android Studio 1.0.2 中将库添加到项目中?

java - 多线程程序无法运行

arrays - 左/右旋转数组后最长递增子数组的长度

java - 如何存储 IP 地址范围与位置

Java正则表达式考虑空值

.net - 当另一个线程正在其上执行方法时使对象引用无效 (.NET)

ios - 在大类上解析 countObjectsInBackground

java空实例变量内存占用