1

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

在 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<0.001736 并且我得到的事件比需要的多。

有什么建议么?


抱歉,我忘了提到我计算的机会是双重机会 = (static_cast)(r) / (static_cast)(RAND_MAX);


它从 static_cast 中删除了 double

双倍机会 = (double)r/(double)(RAND_MAX);

4

5 回答 5

7

r和都是RAND_MAX整数,所以表达式

double chance = r / RAND_MAX;

用整数算术计算。尝试:

double chance = 1.0 * r / RAND_MAX;

这将导致除法是浮点除法。

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

于 2008-11-13T19:57:04.417 回答
7

如果您选择是否每秒发生一个事件,您将有 0 个事件发生或 8*60*60 个事件发生的变化。如果 50 个事件是一个约束,请在 8 小时内选择 50 个随机时间并将它们存储起来。

于 2008-11-13T19:58:17.533 回答
2
  • 创建一个包含 50 个数字的列表。
  • 用 1 到 8 * 60 * 60 之间的随机数填充它们。
  • 对它们进行排序

你有50秒。

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

于 2008-11-13T19:58:40.513 回答
2

正好 50 个,还是平均 50 个?

您可能想查看指数分布并为您的语言找到支持它的库。

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

您可以使用统一的 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;
于 2008-11-13T20:17:23.657 回答
0

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

于 2008-11-13T19:58:50.497 回答