Ошибка, когда я даю sleep(1000), чтобы заставить srand() работать, в Visual C++

У меня есть следующая программа:

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 ответов

Очевидно, вам не нужно спать. Код кажется мне вменяемым, если только вы вызываете srand() один раз. Если вы вызываете весь этот блок кода несколько раз в течение одной секунды, то time(NULL) будет возвращать одно и то же второе значение, а srand() начнет генерирование псевдослучайного числа с того же номера, выбирая тот же набор из 10 последующих номера....

Мне кажется, ваша программа должна работать без вызова сна. На самом деле, кажется, работает для меня на VS2008 отлично. Я считаю, что ваши проблемы должны быть в коде, который вы удалили, считая его неуместным.

Работает без проблем с 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;
}

Размещенный вами фрагмент кода вряд ли ответственен за прекращение работы вашего приложения, Sleep или нет.

Потому что, если я удаляю Sleep(1000), он не выдает никакой ошибки, но также не дает случайных значений.

Что ж, rand() безусловно, дает вам псевдослучайные числа, хотя реализация PRNG может не возвращать случайные значения, равномерно распределенные по битам возвращаемого значения, то есть во многих реализациях старшие биты меняются чаще, чем младшие биты, поэтому ваш код плохой выбор для выбора случайного значения от 0 до 255.

В общем, я бы порекомендовал переключиться с rand/srand вашей стандартной библиотеки на реализацию вроде mersenne twister boost ( boost:: random) или хотя бы посмотреть

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

Каково содержание "еще нескольких строк кода"?

<психическая отладка>Бьюсь об заклад, у вас есть код, который, прямо или косвенно, зависит от случайного значения, которое вы сгенерировали ранее. Этот код, скорее всего, будет делением или включит установку длины некоторого контейнера и борки, когда сгенерированное случайное число равно 0.

Другие вопросы по тегам