当我给睡眠(1000),使srand()工作,在Visual C ++中出错

时间:2011-02-08 08:11:24

标签: c++ visual-c++ sleep visual-c++-2008 visual-c++-2008-express

我有以下计划:

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),它不会给出任何错误,但它不会给出随机值

5 个答案:

答案 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)这样的实现,或者至少看看

http://c-faq.com/lib/randrange.html

答案 4 :(得分:0)

“更多代码行”的内容是什么?

&lt; psychic debugging&gt;我打赌你有代码,直接或间接地依赖于你之前生成的随机值。此代码可能是一个除法,或涉及设置某个容器的长度,并在生成的随机数为0时进行borks。&lt; / psychic debugging&gt;