【发布时间】: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 问题应该是关于一个具体的、明确提出的、明确规定的、狭窄的、具体的问题。如果您不知道是否有有任何问题,这里不是地方。