我收到了这个面试问题,需要为它编写一个函数。我失败了。
因为这是一个电话采访问题,我不认为我应该编码的代码真的需要成为完美的随机测试人员。
有什么想法吗?
在面试中如何在30分钟内编写一些合理的随机性测试代码?
修改
此问题中的分布是均匀分布
答案 0 :(得分:5)
由于这是一个面试问题,我认为面试官希望以两种方式进行评估:
在某些情况下,这可能是一个非常好的面试问题,特别是如果面试官愿意在必要时提示候选人提出问题。
在理解问题的要求方面,如果你知道这是一个非常棘手的问题,那么见证Diehard tests中提到的pjs's answer。从根本上说,我认为候选人需要表现出对两件事的赞赏:
(a)数字的整体分布应与所需的分布相匹配(我假设在这种情况下它是统一的,但是@pjs指向在评论中,这个假设应该明确表示。)
(b)绘制的每个数字应与以前绘制的数字独立。
用半小时的时间在电话采访中编写代码,你不能走得太远。如果我回答这个问题,我会尝试建议:
(a)要测试分布,请为浮点数设置一组相等大小的二进制数,并计算落入每个二进制数的数字。绘制直方图和眼球(绘制数据总是一个好主意)。要扩展这一点,您可以使用卡方检验,如amit's answer中所述。
但是,如评论中所述,here
卡方检验的主要问题是选择间隔的数量和大小。虽然经验法则可以帮助产生好的结果,但是对于各种应用来说都没有灵丹妙药。
为此,可以使用Kolmogorov-Smirnov测试。这个测试背后的想法是,如果你的有序数据的图应该是一个很好的拟合完美的有序数据(称为累积分布)。对于均匀分布,完美有序数据是一条直线:您希望数据的第10个百分位数是整个范围的10%,第20个百分比是整个范围的20%,依此类推。因此,以编程方式,您可以对数据进行排序,将其与理想值进行对比,然后您应该得到一条直线。您还可以应用正式的定量统计测试,该测试基于实际值和理想值之间的差异。
(b)为了测试独立性,有多种方法。 Autocorrelation在不同的时间滞后是一个相当明显的时间:例如, t 时的值与 t + 1 时的值相似的程度,例如。 runs test是另一个好的:你将所有数字转换为1或0,具体取决于它们是否高于或低于中位数,然后运行长度的分布可用于构建统计检验。运行测试也可用于测试一个方向或另一个方向的运行,如here和here所述(在您的情况下这可能更有用)。只要你有公式可供使用,这两个都有相当简单的实现!
答案 1 :(得分:2)
检查随机数生成器(或任何其他概率)是否与所需模型匹配的方法(在您的情况下,均匀分布) - 您应该使用统计测试Pearson's chi squared test。< / p>
测试基于收集观察结果,并根据您假设数字来自的理论模型将它们与预期概率相匹配。
最后,测试给出了收集的样本确实来自给定模型的概率。
一个简单的例子:
给定一个立方体,并绘制:[5,3,5,5,1,1]
立方体是否平衡? ({1,...,6})
p=1/6
鉴于上述观察,我们创建了预期向量:E = [1,1,1,1,1,1]
(每个条目为N/6
- 6因为这是结果数,N
是绘制数,6英寸上面的例子)。和观察到的向量:O=[2,0,1,0,3,0]
由此我们计算统计数据:
Xi^2 = sum((O_i - E_i)^2 / E_i) = 1/1 + 1/1 + 0/1 + 1/1 + 4/1 + 1/1 = 8
现在,根据chi^2 distribution(一个自由度),我们需要检查P(Xi^2>=8)
的概率是多少。这个概率是~0.005(稍微减少......)。因此,我们可以拒绝这样的假设,即样本来自无偏多维数据集的概率非常高。
答案 2 :(得分:2)
你说他们希望你重建/重新发明Marsaglia多年来开发的"diehard" battery of tests?我会以不合理的期望来称呼他们。
答案 3 :(得分:0)
无论随机浮点数具有什么分布,即在区间[0,1]上均匀分布,您可以使用Kolmogorov-Smirnov检验http://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test来测试样本是否不符合所需分配。如果您有许多可能的值,这可能比卡方检验有优势(因为如果您有比样本更多的值,那么您必须为卡方检验定义桶,这使得测试与一般分布检查相比不那么强大像Kolmogorov-Smirnov)