Random()

Тема в разделе "Общие вопросы по С и С++", создана пользователем Louis, 21 фев 2008.

  1. Louis

    Louis Гость

    Код (Text):
    #include <iostream>
    #include <windows>
    #include <stdlib.h>

    void main(void)
    {int mas[10],i,k;
    system("cls");
    for (i=1; i<=10; i++) {mas[i]=rand();
    cout<<mas[i];
    cout<<"\n";}
    }
    Случайные числа генерирует. НО... аосле повторного запуска числа НЕ МЕНЯЮТСЯ....
    Ткните носом... что я делаю неправтльно???!!!!
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Все правильно ты делаешь! С чего ты взял что числа должны быть разными, это ведь псевдослучайные числа? Для установки начального значения генератора используется srand()

    Перед циклом сделай:
    Код (Text):
    srand( (unsigned int)time( NULL ) );
     
  3. Louis

    Louis Гость

    Вот спасибо!!! :blink:


    после вставки
    Код (Text):
    srand( (unsigned int)time( NULL ) );
    числа при каждом запуске новые!!!
    может подскажешь где можно про это прочитать?? я не совсем понял как работает :rolleyes:
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Louis+21:02:2008, 13:16 -->
    <span class="vbquote">(Louis @ 21:02:2008, 13:16 )</span><!--QuoteEBegin-->может подскажешь где можно про это прочитать?
    [snapback]99063" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    В MSDN :rolleyes: А что не понятно? srand устанавливает смещение для генератора по переданному значению, time( NULL ) - возвращает текущее значение времени в виде секунд от 1-го января 1970 года, т.е. достаточно уникальное число. Правда если запустить за одну секунду несколько экземпляров программы, то числа будут одинаковые
     
  5. Louis

    Louis Гость

    Понял!
    Спасибо!
     
  6. Karrde

    Karrde Гость

    А вот кстати есть какой нить другой способ. а то мне в программе приходится генерить за короткое время довольно большое число чисел, и очень часто они совпадают. Какие ещё есть варианты генерации псевдослучайных чисел?
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Karrde, напишите свой генератор. Описание есть ЗДЕСЬ
     
  8. gamecreator

    gamecreator Гость

    а ты точно не исполняешь srand несколько раз?
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    К чему это? Ведь rand() генерирует значения от 0 до 32767, т.е. в самом лучшем случае повторения будет при генерации 32768 значения, в худшем случае - при генерации второго. И srand() тут слабый помощник
     
  10. gamecreator

    gamecreator Гость

    ну тогда можно складывать 2 значения rand, чтобы получить unsigned int, или сделать из двух unsigned int один unsigned long int
     
  11. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    И еще на 5 умножить... Это сильно повысит уникальность? Может проще взять готовый не стандартный генератор, чем пороть подобную горячку. Не поленись и посмотри ссылку, которую я давал выше
     
  12. gamecreator

    gamecreator Гость

    я про использование стандартного генератора
     
  13. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Я понимаю...
    В условиях, когда
    стандартный генератор не лучший инструмент
     
  14. Igorg

    Igorg Гость

    Karrde Не, ну если нужен супер-пупер генератор -- используйте аппаратные генераторы случайных чисел:) А попроще можно так сделать:

    void GetSystemTime(LPSYSTEMTIME lpSystemTime);

    typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME;

    SYSTEMTIME st;

    GetSystemTime(&st);
    unsigned seed = st.wYear + st.wMonth + ... + st.wMilliseconds; // это для большей случайности зерна (здесь учтены миллисекунды плюс бОльшая периодичность -- секунда, минута и т. д.)
    // ну а далее один из вышеуказанных вариантов (в том случае, если не нужно какое-то стандартное распределение, можно и умножать и делить и складывать и вычетать и возводить в степень и издеваться над числом как захочешь -- и складывать пять псевдослучайных, каждое из которых сгенерировано с новым зерном...) Фишка в том, что вероятность повторов все равно будет обусловлена диапазоном представления. Кстати, в MS CRT есть такая функция: errno_t rand_s(unsigned int *randomValue); По заявлениям, генерирует от 0 до UINT_MAX, более того, эти числа можно безопасно в криптографии использовать (?). И еще, никак не связана с srand() и rand().
    PS. Досадная опечатка, конечно же unsigned seed = (DWORD)st.wYear << 0x1000000 + (DWORD)st.wMonth << 0x400000 + ... + st.wMilliseconds;
     

Поделиться этой страницей