Случайные числа.Как их сделать действительно случайными?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 2 дек 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Пытаюсь получить строку из случайных букв:
    Код (Text):
    1. void randstr(int leng,char *_out)
    2. {                                              
    3.     if(leng<1025 && leng>0)
    4.     {
    5.         char *out=new char[1024];
    6.         char *chr;
    7.         memset(out,NULL,1024);
    8.         char alphabet[]="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    9.         for(int i=0;i<leng;i++)
    10.         {
    11.             //srand(time(0));
    12.             srand(GetTickCount());
    13.             wsprintf(chr,"%c",alphabet[rand() % (strlen(alphabet)-1)]);
    14.             strcat(out,chr);
    15.             //MessageBox(0,chr,"!",MB_OK);
    16.         }
    17.         strcpy(_out,out);
    18.         delete []out;
    19.     }
    20. }
    Да вот только в цикле(если без задержек) всегда вылазит одно и то же число.Как можно исправить?
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Добавить srand(time(0)) ДО цикла.
    Из цикла все srand() убрать.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Спасибо помогло.Но все таки интересно почему srand в цикле приводит к такому эффекту?
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    В каждом шаге цикла ты инициализируешь рандомайзер с помощью текущего времени. А так как твой цикл у тебя выполняется очень быстро, то на каждом шаге цикла текущее время одинаковое вплоть до секунды, поэтому у тебя генерируется всегда одна и та же последовательность. Это раз. Второе - инициаилизировать рандомайзер нужно всего лишь раз, перед циклом.