您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。
摘要:蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据。如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对象,选中的概率是1n。那长度未知特别是
蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据。如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对象,选中的概率是1/n。那长度未知特别是如果这个大数据集不能一次性放入内存中,蓄水池抽样算法就非常有用,在我的项目中采用的蓄水池随机抽样还加入了权重的计算。
其中方法中核心代码,也就是蓄水池抽样就是如下代码。
if (i < spotQuantity)
{
titleIndexList.Add(i);
eigenValueList.Add(tempEigenValue);
}
else
{
double minEigenValue = eigenValueList.Min();
int minIndex = eigenValueList.IndexOf(minEigenValue);
if (tempEigenValue > minEigenValue)
{
eigenValueList[minIndex] = tempEigenValue;
titleIndexList[minIndex] = i;
}
}
首先从计算出的要抽取多少数量,根据数据循环,先让抽取数量的数据放入池子中titleIndexList,并且将对应数据的权重放入到抽取数据的权重列表。
在后面的循环中,判断抽取的权重如果大于已经抽取的最小权重则替换最小权重的数据为当前循环的数据。
如果你不是按照权重则在数据大于抽取数时,产生一个0-n(n为当前循环到的数据长度)的随机数,如果随机数落在已经抽取队列的数组下标内,则当前循环的数据替换掉原来的下标数据也能实现随机性。
public static void WeightedSampling(List<article> articleList, int grade)
{
//根据传入的grade 计算一个抽样数量。
