0

我想为许多 Servlet 请求生成一些随机数。问题是如果我在每个 servlet 中使用一个新的 Random 对象,则总体概率将不正确。

例如,大约有 10000+ 个请求,我希望所有随机值都应该在该范围内均匀分布。

4

2 回答 2

2

那么为什么不使用全局Random实例呢?

或者你可以使用ThreadLocalRandom哪个更快。它是一种全球性的,因为您无法真正创建它的实例。您可以通过调用来获取实例ThreadLocalRandom.current()。在 Java 7 中,它返回一个每个线程的实例。在 Java 8 中,它被进一步优化,它总是返回相同的单例。

于 2013-02-19T04:13:18.517 回答
0

使用 Random 获得真正的随机序列有点复杂。Random 是基于 LCG 的,周期为 2^48,你需要非常小心种子。有一种方法可以使用 DataStore 生成单个序列来保持当前值,但性能不会很好,因为每次生成新的随机数时都需要更新值。这意味着您将能够在没有 memcahce 的情况下达到 10-20 个请求/秒,而使用 memcache 可能达到 100 个请求/秒左右。分片不会很有帮助,因为您需要保留原子种子值。

算法将如下所示:

  1. 生成第一个 Integer(要使用 long,您将需要额外的处理。生成 int 要简单得多)。
  2. 设置种子 = 随机 <<< 16
  3. 将种子保存到 DataStore(不要忘记事务)
  4. 在每个下一个请求(整个操作应该在一个事务中):

    4.1。从 DataStore 读取种子

    4.2. 用你的种子创建新的随机数。

    4.3. 生成新的整数。

    4.4. 设置种子 = 随机 <<< 16

    4.5. 将种子保存到 DataStore

于 2013-02-19T18:53:19.633 回答