如何执行一个函数 x% 的执行次数?

How to execute a function x% of the times it is to be executed?

本文关键字:执行 函数 何执行 一个      更新时间:2023-10-16

用例:实时提供实时图像,可以在屏幕上查看。为了降低 CPU 负载,用户应该能够丢弃图像,只显示 10% 或 50% 的图像。

如果用户选择 50%,则应显示所有其他图像(不是连续 50 张图像,然后丢弃 50 张,因为这也是 50%..(

当前代码:

void paintImage(int everyWhatImage)
{
showImage();
}

显示图像 100% 的时间。

如果用户提供一个整数,如 1,2,3 ..,表示每一、每一秒、每三等,可以使用像这样熟悉的东西:

void paintImage(int everyWhatImage)
{   
if(counter % everyWhatImage)
{
showImage();
}
counter++;
}

但是,上述算法不支持显示少于 50%("2"(的图像,因此问题是,如何做到这一点?

由于这是一个实时流媒体应用程序,因此需要快速。

此外,上面的代码是在回调函数中执行的,因此不知道何时执行。

任何给定的图片要么显示,要么不显示。如果没有显示,那么未来显示任何图片的机会应该会增加。如果显示它,任何未来图片的机会都应该会下降。

因此,最多数到 100。如果您上或超过 100 个,请出示图片...并减去 100:

static counter(0);
if (counter >= 100) {
showImage();
counter -= 100;
}
counter += chance;

其中chance例如70,这意味着"显示70%的图片"。通过它:

  • 第一张图片:未显示;计数器为70。
  • 第二张图片:如图所示;计数器为40。
  • 第三张图片:如图所示;计数器位于 10。
  • 第四张图片:未显示;计数器为80。
  • 第五张图片:如图所示;计数器为50。
  • 第六张图片:如图所示;计数器为20。
  • 第七张图片:未显示;计数器为90。
  • 第八张图片:如图所示;计数器为60。
  • 第九张图片:如图所示;计数器为30。
  • 第十张图片:如图所示;计数器为 0。

.. 它从那里循环。

在"运行余额"中保存给定的比例。 每次达到至少 1.00 时,"兑现"图像的节省。

以 27% 为例...

show_count = 0.00
ratio = 0.27
while (we have more images to show) {
show_count += ratio
if (show_count >= 1.00) {
show_image()
show_count -= 1.00
}

这个问题的其他答案似乎都实现了计数器,所以我想我会建议一种概率方法。每次调用函数时,您可以生成一个介于 0 和 1 之间的随机数:

random = ((double) rand() / (RAND_MAX))

然后,如果随机数低于要显示的图像的规定百分比,则显示图像。 否则,请丢弃它。