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

Java 如何跨多个请求生成随机值,java,google-app-engine,Java,Google App Engine,我想为许多Servlet请求生成一些随机数。 问题是,如果我在每个servlet中使用一个新的随机对象,那么总体概率将是不正确的 例如,对于大约10000多个请求,我希望所有随机值都应在该范围内均匀分布。那么为什么不使用全局随机实例呢 或者您可以使用更快的ThreadLocalRandom。它是一种全局性的,因为您无法真正创建它的实例。您可以通过调用ThreadLocalRandom.current()来获取实例。在Java7中,它返回每个线程的实例。在Java8中,它被进一步优化,总是返回相同

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


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

那么为什么不使用全局
随机
实例呢


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

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

算法将如下所示:

  • 生成第一个整数(要使用long,您需要额外的处理。生成int要简单得多)

  • 设定种子=随机在什么意义上总概率是不正确的?无论如何,如果您想要一个随机对象,只需放入一个类并使其成为静态的。我对GAE和servlet是新手。不确定是否将每个servlet请求视为独立的应用程序,并由云服务器上的不同线程分别处理。我回家后会试试你的建议。thx@Nick当应用程序实例启动时(分别在第一次请求时),JVM将对servlet类进行一次实例关联。然后,你的代码被一个唯一的线程调用,一个接一个的请求。使用单例是一个好主意,您将在给定实例上的请求之间保持一致性。如果在配置文件中添加threadsafe=true元素,您的代码将被多个线程调用,从而允许在单个实例上并发(这意味着请求将被并行处理)。