【问题标题】:tread 1 error - using rand()function踩踏 1 错误 - 使用 rand() 函数
【发布时间】:2015-03-29 10:53:39
【问题描述】:

我必须选择 0 到 3 之间的随机数。我必须多次调用此函数。一开始它一直在工作,但一段时间后出现错误消息Tread 1: EXC_BAD_ACCESS(code =2, address 0x7fff5f3ffff8。

这是我的代码。 m_p[multiproject][project] 等于 4;

int selecteer_random_resource(int multiproject, int project)
{   int k=0;
    k=rand()%m_p[multiproject][project];
    return k;
}

我真的不明白为什么它一开始就可以工作,过了一段时间又出现了错误。

【问题讨论】:

  • 真的取决于m_p、multiproject 和project 你不觉得吗?尝试将代码编辑成一个简短的完整示例。
  • 在这里查看答案stackoverflow.com/questions/16363513/… 并尝试您的调试器

标签: c++ random


【解决方案1】:

rand() 是 not 线程安全的,它在文档中这么说。 引用https://stackoverflow.com/a/6161352/4433386:

也就是说,文档指出:

函数 rand() 不是可重入或线程安全的,因为它使用在每次调用时修改的隐藏状态。这可能只是 下一次调用要使用的种子值,或者它可能更多 精心制作的。为了在线程中获得可重现的行为 应用程序时,必须明确说明此状态。函数 rand_r() 提供了一个指向 unsigned int 的指针,用作状态。 这是一个非常少量的状态,所以这个功能会很弱 伪随机发生器。请改用 drand48_r(3)。

上面强调的部分可能是你所有的原因 线程获得相同的编号。

您应该使用线程安全的随机数生成器,尤其是在 2015 年。 Boost/C++11 有 <random> 标准库,包含了线程安全地生成随机数的很棒的方法。

如果你不能使用 boost 或 C++11,你也可以试试drand,例如drand48_r.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 2012-10-14
    • 1970-01-01
    • 2015-05-25
    • 2014-01-02
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多