0

我有以下程序:

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

4

5 回答 5

4

显然你不应该睡觉。只要您只调用 srand() 一次,代码对我来说就很正常。如果您在秒内多次调用整个代码块,则 time(NULL) 将返回相同的秒值,并且 srand() 将以相同的数字开始伪随机数生成,随后选择相同的 10 个集合数字……

于 2011-02-08T08:20:06.570 回答
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;
}
于 2011-02-08T08:17:44.793 回答
1

您发布的代码片段几乎不会对您的应用程序终止Sleep或不负责。

因为如果我删除 Sleep(1000),它不会给出任何错误,但它也不会给出随机值。

好吧,rand()当然会给你伪随机数,尽管 PRNG 实现可能不会返回沿返回值的位均匀分布的随机值,即在许多实现中,高位比低位更频繁地变化,这就是为什么你的对于选择 0 到 255 之间的随机值,代码是一个糟糕的选择。

一般来说,我建议从标准库的 rand/srand 切换到像 boost 的 mersenne twister ( boost::random ) 这样的实现,或者至少看看

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

于 2011-02-08T08:25:41.900 回答
1

在我看来,您的程序应该可以在没有睡眠调用的情况下完美运行。事实上,我似乎在 VS2008 上完美地工作。我相信你的问题一定是在你认为它不相关的代码中被删除了。

于 2011-02-08T08:21:53.673 回答
0

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

<psychic debugging>我敢打赌,你那里有直接或间接依赖于你之前生成的随机值的代码。这段代码很可能是一个除法,或者涉及设置一些容器的长度,当生成的随机数为 0 时就会出错。</psychic debug>

于 2011-02-08T10:50:24.707 回答