我有以下计划:
srand((unsigned) time(NULL));
for (int w = 0; w < 10; w++) {
int ran_x;
ran_x = rand() % 255;
cout << "nRandom X = " << ran_x << endl;
//some more lines of code
Sleep(1000);
}
我在visual c ++ 2008上运行它,当我运行这个程序时,它不会显示任何错误或警告。但是当我运行它时,有时它运行正常,有时它会在中间停止并发出此错误“此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队获取更多信息。“
我该怎么办?是否可以在不使用Sleep()函数的情况下完成它,并且仍然可以获得随机生成的值。因为如果我删除Sleep(1000),它不会给出任何错误,但它不会给出随机值
答案 0 :(得分:4)
显然你不应该睡觉。只要你只调用srand()一次,代码看起来就是理智的。如果你在秒内多次调用这整个代码块,那么time(NULL)将返回相同的第二个值,srand()将以相同的数字开始伪随机数生成,选择相同的10个后续集合号....
答案 1 :(得分:1)
使用gcc
没有任何问题#include <iostream>
#include <cstdlib>
int main (int argc, char *argv[])
{
srand( time(0) );
for (int w = 0; w < 10; w++)
{
int ran_x = rand() % 255;
std::cout<<"\nRandom X = " << ran_x << std::endl;
sleep(1);
}
return 0;
}
答案 2 :(得分:1)
对我来说,你的程序应该在没有睡眠呼叫的情况下完美运行。事实上,似乎在VS2008上完美地为我工作。我相信你的问题必须在你已经删除的代码中认为它无关紧要。
答案 3 :(得分:1)
您发布的代码段几乎不对您的应用程序终止负责,Sleep
。
因为如果我删除睡眠(1000),它 不会给出任何错误,但它没有 给出随机值。
好吧,rand()
肯定会给你伪随机数,尽管PRNG实现可能不会返回沿返回值的位均匀分布的随机值,即在许多实现中,较高位的变化频率高于低位,这就是为什么你的代码选择0到255之间的随机值的不良选择。
一般来说,我建议从标准库的rand / srand切换到boost的mersenne twister(boost::random)这样的实现,或者至少看看
答案 4 :(得分:0)
“更多代码行”的内容是什么?
&lt; psychic debugging&gt;我打赌你有代码,直接或间接地依赖于你之前生成的随机值。此代码可能是一个除法,或涉及设置某个容器的长度,并在生成的随机数为0时进行borks。&lt; / psychic debugging&gt;