• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Random()

  • Автор темы Louis
  • Дата начала
L

Louis

Код:
#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";}
}

Случайные числа генерирует. НО... аосле повторного запуска числа НЕ МЕНЯЮТСЯ....
Ткните носом... что я делаю неправтльно???!!!!
 
E

European

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

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

Louis

Все правильно ты делаешь? С чего ты взял что числа должны быть разными, это ведь псевдослучайные числа. Для установки начального значения генератора используется srand()

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

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


после вставки
Код:
srand( (unsigned int)time( NULL ) );

числа при каждом запуске новые!!!
может подскажешь где можно про это прочитать?? я не совсем понял как работает :rolleyes:
 
E

European

<!--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 года, т.е. достаточно уникальное число. Правда если запустить за одну секунду несколько экземпляров программы, то числа будут одинаковые
 
K

Karrde

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

European

Karrde, напишите свой генератор. Описание есть
 
E

European

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

gamecreator

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

European

ну тогда можно складывать 2 значения rand, чтобы получить unsigned int, или сделать из двух unsigned int один unsigned long int
И еще на 5 умножить... Это сильно повысит уникальность? Может проще взять готовый не стандартный генератор, чем пороть подобную горячку. Не поленись и посмотри ссылку, которую я давал выше
 
G

gamecreator

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

European

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

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;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!