胎面1错误 - 使用rand()函数

时间:2015-03-29 10:53:40

标签: c++ random

我必须选择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;
}

我真的不明白为什么它在开始时工作,一段时间后出现错误。

1 个答案:

答案 0 :(得分:0)

rand() 线程安全,它在文档中也是如此。 引用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