【问题标题】:Generating a random ratio生成随机比率
【发布时间】:2021-04-14 18:28:45
【问题描述】:

我正在看一本书,它有这个功能。我不明白使用rand()/(RAND_MAX) 有什么用,它不只是产生随机比率value 吗?我们如何使用随机比率value来检查它是否大于指数?

#include <cmath>

bool isCustomerArrived(double arvTimeDiff)
{
    double value;

    value = static_cast<double> (rand()) / static_cast<double>(RAND_MAX);

    return (value > exp(- 1.0/arvTimeDiff));
}

我从书中得到的解释是

要运行模拟,我们需要知道在给定时间单位到达的客户数量以及为客户服务需要多长时间。我们使用统计学中的泊松分布,它表示在给定时间发生 y 事件的概率由以下公式给出:here 其中 λ 是 y 事件在该时间发生的预期值。假设,在 平均每四分钟就有一位顾客到达。在这四分钟的时间里,客户可以在四分钟中的任何一分钟到达。假设四分钟中每一分钟的可能性相等,因此,客户在四分钟内到达的期望值是 1/ 4 = 0.25。接下来,我们需要确定客户是否真的在给定的时间到达。 现在,P(0)= e^ (- λ) 是在给定时间没有事件发生的概率。泊松分布的基本假设之一是在短时间内发生多个结果的概率可以忽略不计。为简单起见,我们假设在给定的时间单位内只有一位顾客到达。因此,我们使用 e^ (- λ) 作为分界点来确定客户是否在给定的时间单位到达。假设平均每四分钟就有一位顾客到达。那么,λ = 0.25。我们可以使用一种算法来生成一个介于 0 和 1 之间的数字。如果生成的数字的值大于 e^ (- λ),我们可以假设客户在特定时间单位到达。例如,假设 rNum 是一个随机数,使得 0 ≤ rNum ≤ 1。如果 rNum 大于 e^ (- λ) ,客户在给定的时间单位到达。

【问题讨论】:

  • 如果你自己问和回答几个简单的问题,你应该能自己弄清楚这一切是做什么的!好的,试试这个: 1) 你知道rand() 返回的值的范围是多少,最小和最大可能值? 2) 什么是RAND_MAX,tihs 值是什么意思? 3)如果rand()返回RAND_MAX,除法的结果是什么? 4) 如果 rand() 返回了 RAND_MAX 的一半,那么结果会是什么,是 RAND_MAX 的四分之一?你明白了吗?
  • 让我花几分钟了解一下
  • 回答你的问题 1. rand() 范围在 0 到 RAND_MAX 2. RAND_MAX 表示 rand() 的上限,它是一个非常大的整数 3. 除法的结果将是 1(概率) 4. 0.5, 0.25 还是不明白,为什么要使用rand()
  • 嗯,rand() 是生成随机数的最简单方法。所以,你说的是rand()除以RAND_MAX意味着你得到一个介于0和1之间的随机值,而不是0和RAND_MAX?那么,您还有什么不清楚的地方?
  • 这应该针对编写整个程序的人,以及这样做的原因。

标签: c++ math random poisson


【解决方案1】:

解释:

  1. #include &lt;cmath&gt;:包含用于执行数学运算的“cmath”库。 See reference here

  2. bool isCustomerArrived(double arvTimeDiff) {:声明一个接受名为arvTimeDiffdouble 值的方法,并返回一个布尔值(真或假)。有关 C++ 中布尔值的更多信息,请参阅 here

  3. double value;:声明一个名为valuedouble变量。

  4. value = static_cast&lt;double&gt; (rand()) / static_cast&lt;double&gt;(RAND_MAX);:将value的值设置为随机数之间的除法(使用rand(),它返回一个int类型,因此我们需要类型转换为double)和最大值rand() 函数输出,是RAND_MAX,所以最大的除法是 1,最小的是 0。因为比率只是分数,所以作者写这行代码的原因是完全有道理的。 (See here for more)

  5. return (value &gt; exp(- 1.0/arvTimeDiff));:返回计算的值是否大于e^(-1/arvTimeDiff)

  6. 我们如何使用随机比率值来检查它是否大于指数?

    我不太明白你的意思……这个程序的目的是什么?

编辑

假设我们有 100 个单位时间,我们有 1 个服务器,服务器平均需要 5 个单位时间来服务客户,但客户平均需要 4 个单位时间到达服务器

根据这些信息,我们可以假设开始时间是t = 0,客户到达的时间很随机,但设法在t = 100 之前来了 25 次。鉴于此,我们知道客户可能不会每 4 个单位及时完美访问一次。该方法的名称为isCustomerArrived,这意味着该方法将返回一个布尔值,说明客户是否已到达。有了这个,我假设创建此方法是为了模拟客户流。该方法的输入参数名为arvTimeDiff,意思是“到达时间差”。这个变量名有两个含义/含义:

  1. 该方法获取客户到达时间之间的时间间隔。

  2. 该方法根据它获取服务器启动(t = 0)到客户到达之间的时间。

我绘制了布尔函数here(e^(-1/arvTimeDiff))的值阈值。

案例 1(从上方):如果您查看该图,您会注意到随着 arvTimeDiff 的值增加(沿 x 轴),函数接近 1。我们可以忽略负面的一面(因为服务器可能在客户到达之前启动)。这意味着,如果方法的输入太大,则没有客户(isCustomerArrived 返回false)。在这种情况下,我认为这本书的作者正在尝试对不规则的客户需求进行建模,因为在从 0 到 4 的图表中(它们的差异大约为 4[平均]),其中客户到达的频率高于每 4 个单位的时间。

案例 2(上图):这模拟了服务器启动时(大致)前两个时间单位内客户需求的巨大增长。可以看出这是因为布尔方法的阈值非常低,但当您达到arvTimeDiff = 10 时,阈值会急剧增加到 ~1。

如果这不是您所需要的,也许您能引用书中关于该项目的几段话吗?

希望这会有所帮助!

【讨论】:

  • 您好,感谢您的回答,对于您的问题,该程序的目的是模拟服务器为客户购买机票。假设我们有 100 个单位时间,我们有 1 个服务器,服务器平均需要 5 个单位时间来服务客户,但客户平均需要 4 个单位时间到达服务器
  • @BeginnerA-Z 请将此类相关信息添加到问题中,而不是在答案下方的评论中。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2017-10-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多