在c++中,我如何制作一个每5分钟改变一次的随机数(1或2)

In C++, how would I make a random number (either 1 or 2) that changes every 5 minutes?

本文关键字:一次 改变 随机数 5分钟 一个 何制作 c++      更新时间:2023-10-16

我正在尝试制作一款简单的游戏,我在游戏中有一个商店。我希望它是每5分钟(如果函数changeItem()被调用)的项目在商店要么切换或保持不变。我没有问题产生随机数,但我还没有找到一个线程,显示如何使它产生不同的每5分钟。谢谢你。

简而言之,跟踪changeItem()函数的最后一次调用。如果距离上次调用它的时间超过5分钟,那么使用随机数生成器生成一个新数字。否则,使用上次生成时保存的数字。

你已经接受了一个答案,但我想说的是,对于需要这样简单的计时,不需要很高的准确性的应用程序,在主循环中进行简单的计算是你所需要的。

为单个计时器启动一个线程会带来很多不必要的开销。下面的代码展示了如何实现它。

#define FIVE_MINUTES (60*5)
int main(int argc, char** argv){
  time_t lastChange = 0, tick; 
  run_game_loop = true;
  while (run_game_loop){
     // ... game loop
     tick = time(NULL);
     if ((tick - lastChange) >= FIVE_MINUTES){
         changeItem();
         lastChange = tick;
     }
  }
  return 0;
}

它在某种程度上假定被合理地定期调用。另一方面,如果你需要它准确,那么一个线程会更好。根据不同的平台,系统会调用计时器的API

标准和可移植的方法:

你可以考虑c++ 11线程。一般的思路是:

#include <thread>
#include <chrono>
void myrandogen ()   // function that refreshes your randum number:
                     // will be executed as a thread  
{
     while (! gameover ) {
        this_thread::sleep_for (std::chrono::minutes(5));   // wait 5 minutes  
        ... // generate your random number and update your game data structure
        }
}

在main函数中,你可以用你的函数实例化一个线程:

thread t1 (myrandomgen);  // create an launch thread 
... // do your stuff until game over
t1.join ();    // wait until thread returns 
当然,你也可以在创建线程时传递参数(对共享变量的引用等),像这样:
 thread t1 (myrandomgen,  param1, param2, ....); 

这种方法的优点是它是标准的和可移植的。

不可移植的替代品:

我不太熟悉这些,但是:

  • 在MSWIN环境中,您可以使用SetTimer(…)来定义一个函数,以定期调用(和KillTimer(…)来删除它)。但这需要围绕windows事件处理循环构建一个程序结构。

  • 在linux环境中,您可以类似地使用signal(SIGALRM,…)定义回调函数,并使用alarm()激活周期性调用。

关于性能考虑的小更新:在对线程和性能的过度消耗进行了几次评论之后,我做了一个基准测试,执行10亿次循环迭代,每10万次迭代等待1微秒。整个程序运行在i7多核CPU上:

  • 非线程执行每毫秒产生213K迭代。

  • 2线程执行每毫秒和每个线程产生209K迭代。所以每个线程稍微慢一点。然而,总执行时间只增加了70到90 ms,因此总吞吐量为418 K迭代。

为什么?因为第二个线程正在使用处理器上未使用的核心。这意味着在适当的架构下,游戏可以在使用多线程时处理更多的计算……