Random 采样包

Random 采样包,random,sampling,Random,Sampling,我正在编写一个硬件数据包处理器,并尝试对数据包进行采样。我的目标是10个包中保留一个。然而,我知道不能只保留每10个数据包,因为这不是一种正确的采样方法 我使用一个随机数生成器,尽管该数字始终在0和(2^n)-1之间。也就是说,如果随机数的大小为4位,则随机数生成器将生成一个介于0和15之间的数字 我的第一种方法是生成一些大小为10或11位的数据。假设一个10位的数字n在0和1023之间。我打算将n个随机数模10,然后从10个数中选择一个。不幸的是,这是不可能的,因为我的硬件包处理器不考虑在编译

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

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

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

我的第二个选择是,如果:

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

if n < 102{
  keep_packet()
} else{
  drop_packet()
}
//介于0和1023之间。random()检索均匀分布的随机数
int n=random();
如果n<102{
保存数据包()
}否则{
丢弃数据包()
}

我想知道这最后一种方法是否真的是一种正确的采样方法,是否和n模10一样正确。

这取决于你所说的“正确”是什么意思

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

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

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

另见:


您的问题似乎与您使用的任何标记无关,除了。除此之外,您还不知道您使用的是哪种语言,也不知道是什么库/框架实现了
random()
function无法确定您拥有的代码是否正确。我要注意的是,即使您在上面陈述了假设,您的方法也不完全正确,因为102个可能的值并不完全是总范围的10%。但它可能足够接近您的目的,这取决于您的确切目标l是。这回答了你的问题吗?@PeterDuniho我添加的标签与SDN有关,因为该设备用于SDN网络,在我看来,网络标签似乎包含了这个主题。如果你认为这些标签过多,这仍然是公平的。你是对的,102不完全是10%,但mod 10也不完全是10%。l语言是P4,但我想大多数人可能不知道,这就是我忽略它的原因。该函数创建一个k位宽的(伪)随机数,均匀分布。我的问题主要集中在询问“n mod 10“和n@PeterO。谢谢你的评论。我想我们所问的是一个不同的概念,就我所能理解的而言。代码审查通常超出了这里的范围。堆栈溢出问题应该是关于一个特定的、明确提出的、明确的、狭窄的、具体的问题。如果你不知道是否有任何问题,这里就不适合了。