为了接收范围内的指定数字,调用 (rand() % range) 的平均迭代次数是多少?

如何解决为了接收范围内的指定数字,调用 (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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?