如何在更大量的数据中以随机顺序分发少量数据?
例如,我有几千行“真实”数据,我想在整个“真实”数据中以随机顺序插入十几行控制数据。
现在我不想问如何使用随机数生成器,我问一个统计问题,我知道如何生成随机数,但我的问题是如何确保数据以随机顺序插入同时在文件中相当均匀地分散。
如果我只依赖于生成随机数,则有可能(尽管非常小)可以将所有控制数据或至少其中的一些数据插入到相当狭窄的“真实”数据中。阻止这种情况发生的最佳方法是什么?
换句话说,我想在整个真实数据中插入控制数据,而没有办法让第三方计算哪些行是控制的,哪些是真实的。
<小时/> 更新:我已经把它变成了一个“社区维基”,所以如果有人想编辑我的问题,那就更有意义了,那么就去吧。
我现在想要在每150行或“真实”数据插入(3000/20 = 150)之后插入这20个'控制'行粗略。但是我不希望它像那样准确,因为我不希望控制行只是根据它们在输出数据中的位置来识别。
因此,我不介意某些的“控制”行聚集在一起,或者某些部分根本没有或几乎没有“控制”行,但一般来说,我希望“控制”行在整个数据中相当均匀地分布。
答案 0 :(得分:3)
如果你真的是随机的话,他们总是有可能彼此接近:)
但我会做的是:
N
行真实数据和{{1>} 控制数据x
- 控制行,我会使用:i
,其中N/(x+1) * i + r
是一个随机数,每个都是不同的控制行,与r
相比较小。选择确定N/x
的任何方式,它可以是高斯,甚至是 flat 分布。 r
是控件行的索引,因此它是i
答案 1 :(得分:0)
这是我的想法。你为什么不循环遍历现有行并为每一行“翻转硬币”来决定是否在那里插入随机数据。
for (int i=0; i<numberOfExistingRows; i++)
{
int r = random();
if (r > 0.5)
{
InsertRandomData();
}
}
这应该可以在整个数据中为您提供良好的随机分布。
答案 2 :(得分:0)
对于以下示例,请使用3000个实际数据行和20个控制行(我的示例比使用英语更好)
如果要在3000个实际数据行之间尽可能均匀地分布20个控制行,则在每个第150个实际数据行插入一个。 因此,为下一个插入索引选择该数字150 a)生成0到150之间的随机数,并从插入索引中减去它 b)在那里插入控制行 c)将插入指数增加150 d)在步骤a)重复
当然这是一个非常粗略的算法,它需要一些改进:)
答案 3 :(得分:0)
如果实际数据比控制数据大或大得多,只需为控制数据生成到达间隔。
所以选择一个随机间隔,复制出那么多行真实数据,插入控制数据,重复直到完成。如何选择随机区间?
我建议使用高斯偏差,将平均值设置为实际数据大小除以控制数据大小,前者可以在必要时进行估算,而不是测量或假设已知。根据您愿意承受的“传播”程度设置此高斯的标准差。较小的stddev意味着更多的leptokurtic分布意味着更严格地遵守均匀间距。较大的stdev意味着更平坦的分布和更宽松的均匀间距。
现在文件的第一部分和最后一部分怎么样?那就是:在开始或结束时插入控制数据怎么样?你可以做的一件事是为这些做出特殊情况估计...但是一个很好的技巧如下:将你的“索引”开到真实数据中,减去高斯平均值的一半,然后产生你的第一个偏差。在您对真实数据的“索引”合法之前,不要输出任何真实数据。 数据末尾的对称技巧也应该能够很好地工作(简单地说:保持生成偏差,直到达到“索引”至少是真实数据末尾之前的高斯平均值的一半。如果在此之前的索引关闭了结束,最后生成数据。
你想要看的不仅仅是统计数据:它有助于为这类事物开发算法来研究基本的排队理论。请参阅维基百科或图灵综合报告,其中有一个很好的简短章节,题目是“模拟”。
另外:在某些情况下,非高斯分布,尤其是泊松分布,可以为这类事物提供更好,更自然的结果。上面的算法大纲仍然适用于任何分布似乎正确的平均值的一半。