我目前正在编写一个roguelike,自然而然地使用了大量随机数。
我正在运行的问题是,如果我“过热”rand();我的程序会崩溃。
如果我每帧只生成20个左右的内容,那很好......但是当随机数量达到数百个时,程序崩溃了。我越是产生每一帧,它越早崩溃......这让我相信有一些堆积。
我已经完成了测试,并且在20兰特();每帧呼叫,它将以最大速度直接运行24小时而不会崩溃。三倍,它不会使它十分钟。
如果我把srand();在初始化中,我可以在它锁定之前生成数千个随机数 - 但是如果我把srand();在框架内部,我使它大约2-8帧。如果重要,我会用时间(null)来播种。
我越频繁地调用rand();它越早崩溃。
帮助?
答案 0 :(得分:1)
函数rand()不是可重入的或线程安全的,因为它使用在每次调用时修改的隐藏状态。这可能只是种子价值 被下一个电话使用,或者它可能更精细。为了在线程应用程序中获得可重现的行为,此状态必须 明确。函数rand_r()提供了一个指向unsigned int的指针,用作状态。这是一个非常少量的国家, 所以这个函数将是一个弱伪随机生成器。请尝试drand48_r(3)。
答案 1 :(得分:0)
尝试在调试器
下运行它$ gdb myprog
(gdb) break main
(gdb) run
(gdb) record
e.g。
(gdb) break abort
(gdb) break exit
因为它是c ++:
(gdb) catch throw
(gdb) catch exception
最后 (gdb)继续
当它停止时,反向继续,直到找到罪魁祸首
选项2:
valgrind --tool=massif --massif-out-file="massif.out.%p" myprog
ms_print massif.out.*
检查堆分析。你不会有内存泄漏
答案 2 :(得分:0)
rand的大量调用可能会出现一个代码无法处理的相对较小范围内的数字。尝试使用只增加数字并返回数字的函数替换对rand的调用,并查看它是否最终失败。
答案 3 :(得分:0)
答案 4 :(得分:0)
关于如何缩小问题根源的一些意见和想法:
srand()
或rand()
函数导致崩溃/锁定。有可能是随机数的一个或多个组合使您的引擎进入发生不良事件的状态。srand(NULL)
尝试使用像srand(12345)
这样的常量种子。根据您的引擎使用的其他因素(如用户输入),这可能足以让它每次都在相同的位置崩溃。#ifdef
,注释掉代码,设置应用程序选项,甚至创建项目的临时副本,以便您可以简单地删除代码,编译和测试。如果项目很大/很复杂,这可能很难。