我想为许多 Servlet 请求生成一些随机数。问题是如果我在每个 servlet 中使用一个新的 Random 对象,则总体概率将不正确。
例如,大约有 10000+ 个请求,我希望所有随机值都应该在该范围内均匀分布。
我想为许多 Servlet 请求生成一些随机数。问题是如果我在每个 servlet 中使用一个新的 Random 对象,则总体概率将不正确。
例如,大约有 10000+ 个请求,我希望所有随机值都应该在该范围内均匀分布。
那么为什么不使用全局Random
实例呢?
或者你可以使用ThreadLocalRandom
哪个更快。它是一种全球性的,因为您无法真正创建它的实例。您可以通过调用来获取实例ThreadLocalRandom.current()
。在 Java 7 中,它返回一个每个线程的实例。在 Java 8 中,它被进一步优化,它总是返回相同的单例。
使用 Random 获得真正的随机序列有点复杂。Random 是基于 LCG 的,周期为 2^48,你需要非常小心种子。有一种方法可以使用 DataStore 生成单个序列来保持当前值,但性能不会很好,因为每次生成新的随机数时都需要更新值。这意味着您将能够在没有 memcahce 的情况下达到 10-20 个请求/秒,而使用 memcache 可能达到 100 个请求/秒左右。分片不会很有帮助,因为您需要保留原子种子值。
算法将如下所示:
在每个下一个请求(整个操作应该在一个事务中):
4.1。从 DataStore 读取种子
4.2. 用你的种子创建新的随机数。
4.3. 生成新的整数。
4.4. 设置种子 = 随机 <<< 16
4.5. 将种子保存到 DataStore