Random()

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

Louis

Гость
#1
Код:
#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";}
}
Случайные числа генерирует. НО... аосле повторного запуска числа НЕ МЕНЯЮТСЯ....
Ткните носом... что я делаю неправтльно???!!!!
 
04.09.2006
2 566
2
Минск
#2
Все правильно ты делаешь! С чего ты взял что числа должны быть разными, это ведь псевдослучайные числа? Для установки начального значения генератора используется srand()

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

Louis

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

Перед циклом сделай:
Код:
srand( (unsigned int)time( NULL ) );
Вот спасибо!!! :blink:


после вставки
Код:
srand( (unsigned int)time( NULL ) );
числа при каждом запуске новые!!!
может подскажешь где можно про это прочитать?? я не совсем понял как работает :rolleyes:
 
04.09.2006
2 566
2
Минск
#4
<!--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

Гость
#6
А вот кстати есть какой нить другой способ. а то мне в программе приходится генерить за короткое время довольно большое число чисел, и очень часто они совпадают. Какие ещё есть варианты генерации псевдослучайных чисел?
 
04.09.2006
2 566
2
Минск
#9
а ты точно не исполняешь srand несколько раз?
К чему это? Ведь rand() генерирует значения от 0 до 32767, т.е. в самом лучшем случае повторения будет при генерации 32768 значения, в худшем случае - при генерации второго. И srand() тут слабый помощник
 
G

gamecreator

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

gamecreator

Гость
#12
я про использование стандартного генератора
 
04.09.2006
2 566
2
Минск
#13
я про использование стандартного генератора
Я понимаю...
В условиях, когда
в программе приходится генерить за короткое время довольно большое число чисел
стандартный генератор не лучший инструмент
 
I

Igorg

Гость
#14
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;