如何解决为了接收范围内的指定数字,调用 (rand() % range) 的平均迭代次数是多少?
int GetNumOfIterations(int highest_num,int num_in_range)
{
int temp = -1;
size_t i = 0;
srand(time(NULL));
while (num_in_range != temp)
{
temp = rand() % highest_num;
++i;
}
return i;
}
它的时间复杂度是多少?在最坏和平均情况下? “i”的平均值是多少?
一个面试官告诉我迭代的平均值就是范围的大小,所以如果范围是 0 到 100,迭代的平均值就是 100。为什么?这是正确答案吗?
提前致谢!
解决方法
它的时间复杂度是多少?在最坏和平均情况下? “i”的平均值是多少?
面试官正在寻找的这个简单的答案,至少在最初,是最坏的情况是无界的(使用真正的随机数生成器)或受生成器周期的限制(使用实际的有限状态伪随机数发电机),该平均值是(大约)highest_num
。下文讨论了更详细的答案。
假设伪随机数生成器至少具有最低质量,它最终应该生成范围内的每个值。由于这些生成器是有限状态机,因此它们会以某个周期P 循环。如果他们的状态有 N 位,P ≤ 2N。对于简单的生成器,N 可能是 32。我想它甚至可能是 16。另一方面,它可能是 1024,在这种情况下,您的计算机在运行 21024 个样本之前就会出现物理故障。
让 R 成为 RAND_MAX
+1。由于您包装了 rand()
模 highest_num
,因此有 ceil(R/highest_num
) 或 floor(R/{{1} }) highest_num
的值,其中 rand()
将产生目标 rand() % highest_num
,分别根据 num_in_range
是否小于 num_in_range
。因此,最坏的情况至多是 P+1−ceil(R/R % highest_num
) 或 P+1−floor( R/highest_num
),分别。
对于平均运行长度,让 L 是平均值,p 是目标值的概率。假设所有样本都是独立的。那么 L 满足 L = p•1 + (1−p)•(1+L ),简单代数显示 L = 1/p。如果 highest_num
小于 num_in_range
,则 p = ceil(R/R % highest_num
) / R.否则,p = floor(R/highest_num
) / R。
当然,使用有限状态伪随机数生成器,样本不是独立的。我们刚刚有一个或多个样本没有击中目标的事实表明我们正处于生成器周期的中途,并且在剩余时间内击中目标的样本数量更加密集。关于这如何影响平均值的讨论留待进一步练习。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。