如何跨多个请求生成随机值

时间:2013-02-19 04:08:21

标签: java google-app-engine

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

E.g。对于大约10000多个请求,我希望所有随机值都应该在该范围内均匀分布。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

算法将如下所示:

  1. 生成第一个Integer(使用很长时间你需要额外的处理。生成int要简单得多。)
  2. set seed = random<<< 16
  3. 将种子保存到DataStore(不要忘记交易)
  4. 在每个下一个请求中(整个操作应该在单个transcation中):

    4.1。从DataStore读取种子

    4.2。用种子创建新的随机。

    4.3。生成新的int。

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

    4.5。将种子保存到DataStore