gpt4 book ai didi

java - Java中的并发随机数生成

转载 作者:行者123 更新时间:2023-11-29 07:36:55 26 4
gpt4 key购买 nike

在网络服务器上,许多线程为客户端提供内容。A/B 测试是在网站上进行的,所以我们需要一个 PRNG 来为每个 session 和测试选择一个变体。显然,当使用 PRNG 的单个实例时,它是并发访问的,因此可能需要适当的锁定或其他机制。

最初我们使用 java.util.Random(juR),但由于它存在上述缺陷,例如How good is java.util.Random ,我们尝试改用 MersenneTwister。然而,由于 Mersenne-Twister relies on an internal state,我们看到性能大幅下降。 , 所以它对 nextInt() 的访问需要同步。另一种可能是 XOR shift PRNG,但它与 Mersenne Twister 有同样的问题。你可以找到一个解释,例如这里:http://xorshift.di.unimi.it/

随机 uses a compareAndSet操作,这似乎要快得多,因为它不需要锁定,但根据 Javadoc 类,它仍然不是线程安全的。相反,建议改用 ThreadLocalRandom,这基本上会产生一个 PRNG 池。根据请求,一个随机可用线程处理 HTTPS 请求,因此从一组可用 PRNG 中选择一个随机 PRNG。显然这是相当快的。

从这样的池中产生的随机数是否与从单个 PRNG 实例中产生的随机数一样好?

另一种方法是使用单个 PRNG 实例从中预先生成一个值流,例如通过使用 ArrayBlockingQueue

哪种解决方案在性能方面效果更好?

最佳答案

通过 BlockingQueue 传递结果,您可以使任何随机数生成器线程安全。

class SafeRandom implements Runnable {

Random r = new Random();
BlockingQueue<Double> q = new ArrayBlockingQueue<>(10);

double get() throws InterruptedException {
return q.take();
}

@Override
public void run() {
try {
while (true) {
q.put(r.nextDouble());
}
} catch (InterruptedException ie) {
}
}

}

关于java - Java中的并发随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com