C++ 在c+中修改模拟时间+;

C++ 在c+中修改模拟时间+;,c++,time,simulation,event-driven,C++,Time,Simulation,Event Driven,我正在编写一个模拟活动的程序,我想知道如何加快模拟时间,比如说,在现实世界中1小时等于程序中1个月 多谢各位 这个程序实际上类似于一个餐厅模拟,你不知道顾客什么时候来。假设我们每一小时挑选一个随机数(2-10)的客户,你只要这样做就可以了。您可以决定在一小时的模拟时间内发生多少事件(例如,如果一个事件每秒发生一次,那么在3600个模拟事件之后,您已经模拟了一小时)。您的模拟不需要实时运行;您可以以计算相关数字的速度运行它。您只需这样做。您可以决定在一小时的模拟时间内发生多少事件(例如,如果一个事

我正在编写一个模拟活动的程序,我想知道如何加快模拟时间,比如说,在现实世界中1小时等于程序中1个月

多谢各位


这个程序实际上类似于一个餐厅模拟,你不知道顾客什么时候来。假设我们每一小时挑选一个随机数(2-10)的客户,你只要这样做就可以了。您可以决定在一小时的模拟时间内发生多少事件(例如,如果一个事件每秒发生一次,那么在3600个模拟事件之后,您已经模拟了一小时)。您的模拟不需要实时运行;您可以以计算相关数字的速度运行它。

您只需这样做。您可以决定在一小时的模拟时间内发生多少事件(例如,如果一个事件每秒发生一次,那么在3600个模拟事件之后,您已经模拟了一小时)。您的模拟不需要实时运行;你可以用最快的速度计算相关的数字。

这取决于它现在是如何获得时间的

例如,如果它调用Linux系统
time()
,只需将其替换为您自己的函数(如mytime),该函数返回更快的时间。也许mytime调用时间并将返回的时间乘以任何有意义的因素。1小时=1个月是720次。在程序开始时处理原点应考虑:

time_t t0;
main ()
{
     t0 = time(NULL);    // at program initialization

     ....

     for (;;)
     {
           time_t sim_time = mytime (NULL);
           // yada yada yada
           ...
     }
}

time_t mytime (void *)
{
     return 720 * (time (NULL) - t0);   // account for time since program started
                                        // and magnify by 720, so one hour is one month
}

这取决于它现在是如何获得时间的

例如,如果它调用Linux系统
time()
,只需将其替换为您自己的函数(如mytime),该函数返回更快的时间。也许mytime调用时间并将返回的时间乘以任何有意义的因素。1小时=1个月是720次。在程序开始时处理原点应考虑:

time_t t0;
main ()
{
     t0 = time(NULL);    // at program initialization

     ....

     for (;;)
     {
           time_t sim_time = mytime (NULL);
           // yada yada yada
           ...
     }
}

time_t mytime (void *)
{
     return 720 * (time (NULL) - t0);   // account for time since program started
                                        // and magnify by 720, so one hour is one month
}

如果模拟依赖于数据(如股票市场程序),只需加快数据的传输速度即可。如果有人认为这取决于time()调用,则必须执行类似wallyk回答的操作(假设您有源代码)。

如果模拟依赖于数据(如股票市场程序),则只需加快数据的传输速度。如果有人认为这取决于time()调用,那么你必须做一些事情,比如wallyk的回答(假设你有源代码)。

如果模拟中的时间是离散的,一个选择是构建程序,以便“每一个滴答”都会发生一些事情。 一旦你这样做,你的程序中的时间是任意快

真的有理由让一个月的模拟时间与现实世界中的一小时完全一致吗?如果是,您可以始终处理对应于一个月的节拍数,然后暂停适当的时间,让一小时的“实时”结束


当然,这里的一个关键变量是模拟的粒度,即每秒钟模拟的时间对应多少个刻度。

如果模拟中的时间是离散的,一个选项是构建程序,以便“每一个刻度”都会发生一些事情。 一旦你这样做,你的程序中的时间是任意快

真的有理由让一个月的模拟时间与现实世界中的一小时完全一致吗?如果是,您可以始终处理对应于一个月的节拍数,然后暂停适当的时间,让一小时的“实时”结束


当然,这里的一个关键变量是模拟的粒度,即每秒钟模拟的时间对应多少个刻度。

听起来像是在实现一个模拟。在这种情况下,您甚至不需要一个自由运行的计时器(无论您使用何种缩放)。这都是由事件驱动的。您有一个包含事件的优先级队列,按事件时间排序。您有一个处理循环,它将事件置于队列的前端,并将模拟时间提前到事件时间。您处理事件,这可能涉及安排更多事件。(例如,
customerArrived
事件可能会导致2分钟后生成
customerOrdersBanner
事件。)您可以使用
random()
轻松模拟到达的客户


到目前为止,我读到的其他答案仍然假设您需要一个连续计时器,这通常不是模拟事件驱动系统的最有效方法。您不需要将实时缩放到模拟时间,也不需要有刻度。让事件驱动时间

听起来您正在实施一个新的解决方案。在这种情况下,您甚至不需要一个自由运行的计时器(无论您使用何种缩放)。这都是由事件驱动的。您有一个包含事件的优先级队列,按事件时间排序。您有一个处理循环,它将事件置于队列的前端,并将模拟时间提前到事件时间。您处理事件,这可能涉及安排更多事件。(例如,
customerArrived
事件可能会导致2分钟后生成
customerOrdersBanner
事件。)您可以使用
random()
轻松模拟到达的客户

到目前为止,我读到的其他答案仍然假设您需要一个连续计时器,这通常不是模拟事件驱动系统的最有效方法。您不需要将实时缩放到模拟时间,也不需要有刻度。让事件驱动时间