Karrde Не, ну если нужен супер-пупер генератор -- используйте аппаратные генераторы случайных чисел
![Smile :-) :-)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
А попроще можно так сделать:
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;