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