ошибка, когда я даю sleep (1000), чтобы заставить srand () работать, в Visual C ++ - PullRequest
0 голосов
/ 08 февраля 2011

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

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 ]

4 голосов
/ 08 февраля 2011

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

1 голос
/ 08 февраля 2011

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

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

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

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

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

1 голос
/ 08 февраля 2011

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

1 голос
/ 08 февраля 2011

Работает без проблем с 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;
}
0 голосов
/ 08 февраля 2011

Что такое «еще несколько строк кода»?

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

...