在c++中,我如何制作一个每5分钟改变一次的随机数(1或2)
In C++, how would I make a random number (either 1 or 2) that changes every 5 minutes?
我正在尝试制作一款简单的游戏,我在游戏中有一个商店。我希望它是每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迭代。
为什么?因为第二个线程正在使用处理器上未使用的核心。这意味着在适当的架构下,游戏可以在使用多线程时处理更多的计算……
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 在c++中,我如何制作一个每5分钟改变一次的随机数(1或2)
- 活动实例在JNI中每隔一秒改变一次