LINUX.ORG.RU

Использование rand()


0

1

Доброго времени суток. Столкнулся с проблемой, что при каждом запуске программы функция генерирует одну и ту же последовательность чисел.
Использую следующий код:

int rnd(int MAX)
{
    return (rand() % MAX) + 1;
}
(взято отсюда)

Как бы это для программы не очень приемлемо.
Посоветуйте что-нибудь, пожалуйста.
Спасибо!



Последнее исправление: GennDALF (всего исправлений: 1)
Ответ на: комментарий от Sylvia

Ну, тогда остается писать свой «велосипед», который будет открывать /dev/urandom и читать из него 4 байта для инициализации rand, а в случае отсутствия /dev/urandom (хотя, я таких систем не встречал) - генерировать из /proc/meminfo, gettimeofday, /proc/discstats и т.п.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Sylvia

> а вот какое-то его изменение для srand уже будет гораздо менее предсказуемым для стороннего наблюдателя не смотрящего в код программы

Что за ерунда? Стороннему наблюдателю, не смотрящему в код программы, будет одинаково предсказуемо/непредсказуемо, есть там деление на 2 или нет.

twosev ★★
()
Ответ на: комментарий от Eddy_Em

в венде нет /dev/urandom , хотя в окружении cygwin/mingw может быть достаточно полная реализация POSIX

что же по части /proc то ее нет много где еще )

можно написать просто, но не портабельно, лучшим вариантом будет /dev/urandom, в случае же ОС Windows, придется искать другой, специфичный путь... Вспомнается как программы генерации ключей заставляют «обезьянничать» с вождением мышки по экрану и печатью на клавиатуре )

Sylvia ★★★★★
()
Ответ на: Перед rand() напишите от bk_

во-первых srand()
во-вторых при таком сиде... при всех запусках программы последовательность случайных чисел будет не случайной, и вообще одинаковой каждый раз

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

На мастдай мне совершенно наплевать. Ну, а если нужно портировать программу на фряху (или где нет /proc ?), то, думаю, и там можно что-то придумать и оформить все в #ifdef блоки.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

В системах bsd есть srandomdev(). Поэтому велосипеды не особо нужны.

twosev ★★
()
Ответ на: комментарий от Eddy_Em

/dev/urandom или /dev/random есть во всех современных юниксах, в совсем совсем старых могло не быть, с /dev/random конечно лучше много данных не брать, в отличие от /dev/urandom

так что будет примерно так (

#ifndef WINDOWS

f=fopen(«/dev/urandom», «r»)
if (!f) f = fopen («/dev/random», «r»);

fgets(buf, 4 , f); fclose(f);

seed = (unsigned int) buf;
#else

велосипедища...

#endif

srand(seed);

Sylvia ★★★★★
()
Ответ на: комментарий от Yareg

возможно и в glib что-то есть,
там много костылей для портируемости

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Если уж заморачиваться отличием urandom от random, то брать нужно гораздо больше 4 байт, и пользоваться не стандартным генератором ПСП

unC0Rr ★★★★★
()
Ответ на: комментарий от Sylvia

Херню написао в торопях.

Надо

srand(time(NULL));

bk_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.