首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RNG崩溃的c++程序

RNG崩溃的c++程序
EN

Stack Overflow用户
提问于 2011-04-05 05:28:12
回答 5查看 1.9K关注 0票数 1

我目前正在编写一个类似于盗贼的代码,并且自然会使用大量的随机数生成。

我遇到的问题是,如果我“过热”rand(),我的程序就会崩溃。

如果我每帧只生成20个左右的整数,这是可以的…但当随机数字的数量达到数百个时,程序就会崩溃。每一帧我产生的越多,它就越快崩溃...这让我相信一定是连环相撞了。

我已经测试过了,在每帧20兰德();调用的情况下,它将以最大速度连续运行24小时而不会崩溃。三倍还不到十分钟。

如果我把srand();放在初始化中,我可以在它锁定之前产生数千个随机数-但是如果我把srand();放在帧本身中,我会使它大约2-8帧。如果这很重要,我将使用time(null)作为种子。

我调用rand()的频率越高,它崩溃的时间就越早。

帮助?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-05 07:46:02

以下是一些关于如何缩小问题来源的评论和想法:

  • 几乎可以肯定的是,不是srand()rand()函数导致崩溃/锁定。有可能是一个或多个随机数的组合让你的引擎进入了一个坏事情发生的状态。
  • 第一步应该是重复这个问题,这样它总是在时间/地点发生。尝试使用像srand(12345)这样的常量种子,而不是使用srand(NULL)。根据您的引擎使用的其他因素(如用户输入),这可能足以使它每次在同一地点崩溃。
  • 如果使用调试器有问题(这是可疑的,可能是缓冲区溢出正在破坏堆栈),请使用久经考验的方法将消息输出到文本日志文件。我建议输出生成的所有随机数,也许您会看到它崩溃时的模式(即,每当生成"42“时,它就会崩溃)。另一种选择是开始在各种函数中添加一些日志消息(从游戏更新循环等高级函数开始)。崩溃后,检查日志并开始添加更多日志消息,直到将其缩小到一行/函数。这不像使用调试器那么快,但有时是一个更好的选择,特别是如果你不知道从哪里开始looking.
  • Once,你可以可靠地复制崩溃,开始删除东西,直到崩溃点改变或消失。这可能涉及到#ifdef、注释掉代码、设置应用程序选项,甚至创建项目的临时副本,这样您就可以简单地删除代码、编译和测试。这可能是困难的,如果项目是large/complex.
  • More的类型的“崩溃”的信息将是有帮助的。通常情况下,程序不只是一般地崩溃,而是有特定的异常发生,锁定,等等。异常详细信息可以帮助您通过一些努力缩小问题的来源。
票数 0
EN

Stack Overflow用户

发布于 2011-04-05 05:33:19

函数rand()不是可重入的,也不是线程安全的,因为它使用的隐藏状态在每次调用时都会被修改。这可能只是下一次调用要使用的种子值,也可能是更复杂的东西。为了在线程化应用程序中获得可重现的行为,必须显式设置此状态。函数rand_r()提供了一个指向无符号整数的指针,用作状态。这是一个非常小的状态,所以这个函数将是一个弱的伪随机生成器。尝试使用drand48_r(3)。

票数 1
EN

Stack Overflow用户

发布于 2011-04-05 05:55:33

尝试在调试器下运行它

代码语言:javascript
运行
复制
$ gdb myprog
(gdb) break main
(gdb) run
(gdb) record

例如:

代码语言:javascript
运行
复制
(gdb) break abort
(gdb) break exit

因为它是c++:

代码语言:javascript
运行
复制
(gdb) catch throw
(gdb) catch exception

最后(gdb)继续

当它停止时,反向继续,直到你找到罪魁祸首。

选项2:

代码语言:javascript
运行
复制
valgrind --tool=massif --massif-out-file="massif.out.%p" myprog
ms_print massif.out.*

要检查堆分析,请执行以下操作。您不是不可能有内存泄漏

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5544550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档