Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 随机性算法_C++_Random_Events - Fatal编程技术网

C++ 随机性算法

C++ 随机性算法,c++,random,events,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 int r=rand(); 双倍机会=r/RAND

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

在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
int r=rand();
双倍机会=r/RAND_MAX;
如果(概率<0.001736)
然后事情发生了
其他的
无事

但大多数情况下,rand()返回0和0,
r
rand_MAX
都是整数,因此表达式

double chance = r / RAND_MAX;
是用整数算法计算的。尝试:

double chance = 1.0 * r / RAND_MAX;
这将导致除法成为浮点除法


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

无论是
r
还是
RAND_MAX
都是整数,因此表达式

double chance = r / RAND_MAX;
是用整数算法计算的。尝试:

double chance = 1.0 * r / RAND_MAX;
这将导致除法成为浮点除法


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

如果选择每秒是发生一个事件,则发生0个事件还是8*60*60个事件。如果50个事件是一个约束条件,则在8小时内选择50个随机时间并将其存储。

如果选择事件是在每秒发生,则发生的更改为0个事件还是8*60*60个事件。如果50个事件是一个限制条件,则在8小时内选择50个随机时间并将其存储。

  • 创建一个50个数字的列表
  • 用1到8*60*60之间的随机数填充它们
  • 分类
你有50秒的时间

请注意,您可以有副本。

  • 创建一个50个数字的列表
  • 用1到8*60*60之间的随机数填充它们
  • 分类
你有50秒的时间


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

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

为什么不创建一个28800元素列表并从中提取50个元素以确定事件的时间?这确实假设两个事件不能同时发生,每个事件需要1秒的时间。您可以使用随机数生成器生成0到x之间的整数值,以便可以在限制范围内拾取。

精确到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;

正好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;

这将有助于了解您使用的语言和兰德库。此问题的标题可能更具描述性。这将有助于了解您使用的语言和兰德库。此问题的标题可能更具描述性。如果您可以将生成的数字用作偏移量,为什么还要创建列表从第一个可用时间开始?如何使生成的数字不会对其他时间值给出不公平的概率?列表的想法仅仅是为了跟踪未选择的值,并防止在保留已选择值列表的情况下重新绘制,可能会再次进行相同的选择。当您可以仅使用生成的数字作为第一个可用时间的偏移量时,为什么还要创建列表?如何使生成的数字如此它没有给其他时间值一个不公平的概率?该列表的目的仅仅是跟踪未选择的值,并防止必须进行重画,如果保存了已获取值的列表,则可能会再次进行相同的选择。