【问题标题】:Sampling packets [closed]采样数据包[关闭]
【发布时间】:2021-05-10 21:12:01
【问题描述】:

我正在编写一个硬件数据包处理器,并且我正在尝试对数据包进行采样。我的目标是保留十分之一的数据包。但是,我知道不能只保留每 10 个数据包,因为这不是正确的采样方法。

我使用随机数生成器,虽然数字总是在 0 和 (2^n) - 1 之间。也就是说,如果随机数的大小为 4 位,随机数生成器将生成一个介于 0 和 (2^n) - 1 之间的数字15.

我的第一种方法是生成一些大小为 10 或 11 位的数字。假设一个 10 位数字 n 将介于 0 和 1023 之间。我计划将 n 随机数取模 10,然后从 10 个数字中选择一个。不幸的是,这是不可能的,因为我的硬件包处理器在编译时不知道 n 的情况下不会考虑模运算。

我的第二个选择是做一个简单的 if:

// between 0 and 1023. random() retrieves a random number with uniform distribution
int<10> n = random();

if n < 102{
  keep_packet()
} else{
  drop_packet()
}

我想知道最后一种方法是否确实是一种正确的采样方法,并且与 n 模 10 一样正确。

【问题讨论】:

  • 除了sampling,您的问题似乎与您使用的任何标签有关无关。除此之外,如果不确切知道您使用的是什么语言以及什么库/框架实现了random() 函数,就无法确定您拥有的代码是否正确。我会注意到,即使按照您上面所述的假设,您的方法也不完全正确,因为 102 个可能的值并不是完全总范围的 10%。不过,对于您的目的来说,它可能已经足够接近了,这取决于您的确切目标是什么。
  • @PeterDuniho 我添加的标签与 SDN 有关,因为该设备用于 SDN 网络,并且在我看来,网络标签似乎涵盖了该主题。如果您认为它们过分,仍然足够公平。你是对的,102 不完全是 10%,但 mod 10 也不完全是 10%。语言是 P4,但我想大多数人可能不知道它,这就是我省略它的原因。该函数创建一个 k 位宽的(伪)随机数,分布均匀。我的问题主要集中在询问“ n mod 10”和 n
  • @PeterO。感谢您的评论。据我所知,我想我们提出了一个不同的概念。
  • 代码审查通常不在此处的范围内。 Stack Overflow 问题应该是关于一个具体的、明确提出的、明确规定的、狭窄的、具体的问题。如果您不知道是否有任何问题,这里不是地方。

标签: random sampling


【解决方案1】:

这取决于你所说的“正确”。

假设n = random() 在区间 [0, 1023) 内输出独立的均匀随机整数,然后检查n &lt; 102 是否会在 102/1024 的时间内成功。 1024 个值中的 102 个将被接受,其余的将被拒绝。它是否有 10% 的时间正确成功?不。它是否正确地成功了 102/1024 次?是的。

同样的假设,检查n % 10 == 9 是否会在 102/1024 的时间内成功。 1024 个值中的 102 个将被接受(即以 9 结尾的值),其余的被拒绝。它是否有 10% 的时间正确成功?不。它是否正确地成功了 102/1024 次?是的。

还有第三种方法:拒绝抽样。继续生成n = random()直到n &lt; 1020,然后检查是否n &lt; 102。这将在 10% 的时间内正确成功。但是,权衡是需要一个以上随机数的可能性为 4/1024,需要两个以上的可能性为 4/(1024^2),依此类推。事实上,拒绝抽样在最坏的情况下会永远运行(就像一般情况一样),在 K 个拒绝后停止该方法会引入偏差。但是,您可以通过适当地选择 K 来使偏差尽可能小(硬件设备“冻结”可能对您来说是可以接受的,也可能是不可接受的)。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2018-06-21
    • 2023-03-28
    • 2015-02-20
    相关资源
    最近更新 更多