Java随机的标准偏差边界被认为是什么



我正在使用java 6 random(java.util.random,linux 64),在将一个页面的一个版本提供到第二个版本之间(正常A/B测试),从技术上讲,我用默认的空构造函数初始化类,并将其注入bean(spring)作为属性。大多数情况下,页面的副本彼此之间的8%( - )之内,但我不时看到偏差高达20%,例如:

我现在有两个分裂的副本:680/570被认为是正常的吗?有比Java随机使用更好/更快的版本吗?

谢谢

20%的偏差似乎很大,但是您需要与训练有素的统计学家交谈,以找出它是否在统计上是异常的。

update - 答案是它不一定是异常的。统计数据预测,您将在大约0.3%的时间内得到异常值。


这样的结果肯定是由随机数发生器引起的。Random类使用一种简单的"线性一致"算法,并且这类算法非常自动相关。根据您使用随机数的方式,这可能会导致应用程序级别的异常。

如果这是您问题的原因,则可以尝试用加密强度随机数生成器替换它。请参阅SecureRandom的Javadocs。SecureRandomRandom贵,但这不太可能在您的用例中带来任何区别。


另一方面,如果这些离群值实际上是以理论预测的大致发生的速率发生,则更改随机数生成器不应产生任何不同。

如果这些异常值确实很麻烦,那么您需要采取其他方法。而不是生成n个随机选择,而是生成一个false/true的列表,并确切地将所需的比率归功于列表;例如使用Collections.shuffle

我相信这是相当正常的,因为它是为了生成随机序列。如果您想在一定间隔后重复模式,我认为您可能需要在构造函数中使用特定的 seed值,并在某些间隔后用相同种子重置随机。

例如。每100/500/n拨打Random.next..后,使用Random.setSeed(long seed)方法以旧值重置种子。

java.util.random.nextboolean()是标准二项式分布的方法,该方法具有SQRT(N*P*(1-P))的标准偏差,p = =0.5。

因此,如果您进行900迭代,则标准偏差为SQRT(900*.5*.5)= 15,因此大多数次分布将在435-465范围内。

但是,它是伪随机,并且在重新开始之前的数字周期有限。因此,如果您有足够的迭代,则实际偏差将比理论上的偏差小得多。Java使用公式种子=(种子 * 0x5deece66dl 0xbl)&((1L<< 48)-1)。您可以编写一个具有较小数字的不同公式以有目的地获得较小的偏差,这将使它成为更糟糕的随机数发生器,但适合您的目的。

您可以在其中创建一个5个trues和5个伪造的列表,然后使用Collections.Shuffle随机化列表。然后,您依次迭代它们。10次迭代后,您将重新调整列表并从头开始。这样,您将永远不会偏离5个。

请参阅http://en.wikipedia.org/wiki/linear_congruential_generator。

最新更新