如何在更大量的数据中以随机顺序分发少量数据?

例如,我有几千行“真实”数据,我想在整个“真实”数据中以随机顺序插入十几行控制数据。

现在我不想问如何使用随机数生成器,我问一个统计问题,我知道如何生成随机数,但我的问题是如何确保数据以随机顺序插入同时在文件中相当均匀地分散。

如果我只依赖于生成随机数,则有可能(尽管非常小)可以将所有控制数据或至少其中的一些数据插入到相当狭窄的“真实”数据中。阻止这种情况发生的最佳方法是什么?

换句话说,我想在整个真实数据中插入控制数据,而没有办法让第三方计算哪些行是控制的,哪些是真实的。


更新:我已经把它变成了一个“社区维基”,所以如果有人想编辑我的问题,那就更有意义了,那么就去吧。
更新:让我尝试一个例子(我不想让这种语言或平台依赖,因为它不是编码问题,这是一个统计问题)。

  • 我有3000行“真实”数据(这个数量会随着运行的不同而变化,具体取决于用户拥有的数据量。)
  • 我有20行“控制”数据(同样,这会根据用户想要使用的控件行数量而改变,从零开始的任何内容)。

我现在想要在每150行或“真实”数据插入(3000/20 = 150)之后插入这20个'控制'行粗略。但是我不希望它像那样准确,因为我不希望控制行只是根据它们在输出数据中的位置来识别。

因此,我不介意某些的“控制”行聚集在一起,或者某些部分根本没有或几乎没有“控制”行,但一般来说,我希望“控制”行在整个数据中相当均匀地分布。

有帮助吗?

解决方案

如果你真的是随机的话,他们总是有可能彼此接近:)

但我会做的是:

  1. 您有 N 行的实际数据和 control 数据的 x
  2. 要获取行的索引,您应该插入 i -th控制行,我会使用: N /(x + 1)* i + r ,其中 r 是一个随机数,与每个控制行不同,与 N / x 相比较小。选择任何确定 r 的方法,它可以是 gaussian ,甚至是 flat 分布。 i 是控制行的索引,因此它是 1< = i< x
  3. 通过这种方式,您可以确保在一个地方避免控制行的冷凝。此外,您可以确定它们彼此之间不会有规律的距离。

其他提示

这是我的想法。你为什么不绕过现有的行并“翻转硬币”呢?为每一行决定是否在那里插入随机数据。

for (int i=0; i<numberOfExistingRows; i++)
{    
    int r = random();
    if (r > 0.5)
    {
        InsertRandomData();
    }    
}

这应该可以在整个数据中为您提供良好的随机分布。

对于以下示例,请使用3000个实际数据行和20个控制行(我的示例比使用英语更好)

如果要在3000个实际数据行之间尽可能均匀地分布20个控制行,则在每个第150个实际数据行插入一个。 因此,为下一个插入索引选择该数字150 a)生成0到150之间的随机数,并从插入索引中减去它 b)在那里插入控制行 c)将插入指数增加150% d)在步骤a)重复

当然这是一个非常粗略的算法,它需要一些改进:)

如果实际数据比控制数据大或大得多,只需为控制数据生成到达间隔。

所以选择一个随机间隔,复制出那么多行真实数据,插入控制数据,重复直到完成。如何选择随机区间?

我建议使用高斯偏差,将平均值设置为实际数据大小除以控制数据大小,前者可以在必要时进行估算,而不是测量或假设已知。根据多少“扩散”来设置该高斯的标准偏差。你愿意忍受。较小的stddev意味着更多的leptokurtic分布意味着更严格地遵守均匀间距。较大的stdev意味着更平坦的分布和更宽松的均匀间距。

现在文件的第一部分和最后一部分怎么样?那就是:在开始或结束时插入控制数据怎么样?你可以做的一件事是为这些做出特殊情况估计...但是一个很好的技巧如下:开始你的“索引”进入真实数据的半高斯均值并产生你的第一个偏差。在您的“索引”之前不要输出任何真实数据。进入真实数据是合法的。 数据末尾的对称技巧也应该能够很好地工作(简单地说:保持生成偏差,直到达到“索引”至少一半高斯平均值超出实际数据的末尾。如果在此之前的索引关闭最后,最后生成数据。

你想要看的不仅仅是统计数据:它有助于为这类事物开发算法来研究基本的排队理论。请参阅维基百科或图灵综合报告,其中有一个很好的简短章节,题目是“模拟”。

另外:在某些情况下,非高斯分布,尤其是泊松分布,可以为这类事物提供更好,更自然的结果。上面的算法大纲仍然适用于任何分布似乎正确的平均值的一半。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top