我需要一些关于随机性算法的帮助。问题是。
在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并且我收到的事件多于所需的事件。
有什么建议吗?
它从static_cast
中删除了doubledouble chance =(double)r /(double)(RAND_MAX);
答案 0 :(得分:7)
r
和RAND_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秒。
请注意,您可以有重复项。
答案 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之间的整数值,以便可以在限制范围内进行选择。