随机算法

时间:2008-11-13 19:53:23

标签: c++ random events

我需要一些关于随机性算法的帮助。问题是。

在8小时内将有50个事件发生。事件可能在随机时间发生。 现在它意味着在每一秒都有发生事件的可能性是50 /(8 * 60 * 60)= .001736。 我怎么能用随机生成算法做到这一点?

我可以得到随机数

int r = rand();
double chance = r/RAND_MAX;
if(chance < 0.001736)
    then event happens
else
    no event

但是大多数时候rand()返回0和0&lt; 0.001736并且我收到的事件多于所需的事件。

有什么建议吗?


抱歉,我忘了提 我计算机会为 double chance =(static_cast)(r)/(static_cast)(RAND_MAX);


它从static_cast

中删除了double

double chance =(double)r /(double)(RAND_MAX);

5 个答案:

答案 0 :(得分:7)

rRAND_MAX都是整数,因此表达式

double chance = r / RAND_MAX;

是用整数运算计算的。尝试:

double chance = 1.0 * r / RAND_MAX;

这将导致除法成为浮点除法。

然而,更好的解决方案是使用随机函数,该函数首先返回浮点值。如果使用整数随机数生成器,则在概率计算中会出现一些偏差错误。

答案 1 :(得分:7)

如果您选择是否每秒都会发生一次事件,则会发生0事件更改或发生8 * 60 * 60事件。如果50个事件是约束,则在8小时期间选择50个随机时间并将其存储起来。

答案 2 :(得分:2)

  • 创建一个包含50个数字的列表。
  • 使用1到8 * 60 * 60之间的随机数填充它们。
  • 对它们进行排序

你有50秒。

请注意,您可以有重复项。

答案 3 :(得分:2)

恰好50,或平均50?

您可能需要查看Exponential distribution并找到支持它的语言库。

指数分布将为您提供以指定平均速率随机发生的事件之间的间隔。

您可以使用统一的RNG“伪造”它,如下所示:

    double u;
    do
    {
        // Get a uniformally-distributed random double between
        // zero (inclusive) and 1 (exclusive)
        u = rng.nextDouble();
    } while (u == 0d); // Reject zero, u must be +ve for this to work.
    return (-Math.log(u)) / rate;

答案 4 :(得分:0)

为什么不创建28,800个元素列表并从中拉出50个元素来确定事件的时间?这确实假设2个事件不能同时发生,并且每个事件需要1秒的时间。您可以使用随机数生成器生成介于0和x之间的整数值,以便可以在限制范围内进行选择。