Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как реализовать нормальный рандом в gcc???


Автор: MrCherry 24.9.2007, 07:33
Код

#include <iostream>
using namespace std;

int main() {
    char a;
    while (true) {
        srand(time(NULL));
        a = rand()%255;
      cout << a;
    }
    return 0;
}


допустим такой код, как сделать чтобы rand всегда выдавал случайное значение?

Автор: MAKCim 24.9.2007, 08:59
Код

...
    int number;
    while (true) {
        srand(number = rand());
        cout << static_cast<char>(number & 0xFF);
    }
...

Автор: bsa 24.9.2007, 09:55
MrCherry, srand надо вызывать только один раз!!!
Код
#include <iostream>
using namespace std;

int main() {
    char a;
    srand(time(NULL));
    while (true) {
        a = rand()&0xFF;
        cout << static_cast<unsigned>(a) << ", ";
    }
    cout << endl;
    return 0;
}

Автор: MrCherry 24.9.2007, 12:00
ой плин... спасибо bsa... 
теперь вопрос на миллион.. почему эта штука заставляет комп пищать при выводе cout << a; ? 

Автор: bsa 24.9.2007, 12:11
потому что есть символ такой BELL (звонок). Если не ошибаюсь, у него код 0x07. cout << a, когда a - это переменная типа char выводится не число, а символ, код которого содержит a.

Автор: comcon1 24.9.2007, 12:17
если нужны случайные с нормальным распределением - ветка функций rand48.
Если хошь абсолютно случайные числа в линухе, делай так:
Код

#ifdef URANDOM
long int lrandom() {
  long int ivar;
  int ud = open("/dev/urandom", O_RDONLY);
  read(ud, (void*)(&ivar), sizeof(long int));
  close(ud);
  return labs(ivar);
}

double drandom() {
  double ivar;
  int ud = open("/dev/urandom", O_RDONLY);
  read(ud, (void*)(&ivar), sizeof(double));
  close(ud);
  return fabs(ivar);
}
#endif

устройство урандом хавает температуру процессора, и как следствие, абсолютно случайна.

Автор: bsa 24.9.2007, 12:31
Цитата(comcon1 @ 24.9.2007,  12:17)
устройство урандом хавает температуру процессора, и как следствие, абсолютно случайна.

Откуда такие сведения?

Автор: comcon1 24.9.2007, 12:35
Цитата

       The random number generator gathers environmental noise from device drivers and other sources into an
       entropy pool.  The generator also keeps an estimate of the number of bits of  noise  in  the  entropy
       pool.  From this entropy pool random numbers are created.

Кто-то говорил. Но то, что написано man urandom, подтверждает.
Кстати, я думал, что есть функция рандома, юзающая этот урандом, как нить быстрее, чем каждый раз открывать-закрывать файл, а открывать один раз и во всем приложении юзать переменную как-то лень...
Но функции я чо-т не нашел. придется делать глобальную переменную файлового идентификатора в приложении((

Автор: bsa 24.9.2007, 13:17
comcon1, обрати внимание, про температуру процессора нет ни слова. Кстати, /dev/urandom - это бесконечный /dev/random. Именно последний - это то, что ты написал. А /dev/urandom он эквивалентен /dev/random пока не кончится энтропия. Как только она кончается начинается заполнение псевдослучайными числами.

Автор: comcon1 24.9.2007, 13:23
если тебе нужно часто читать рандом, то где гарантия, что энтропия не кончится?? environmental noise - шум внешней среды. Сюда, мне кажется как раз и относится температура процессора, скорость вентилятора и пр. Разве нет?? Тогда что сюда относится?

Автор: bsa 24.9.2007, 13:27
comcon1, думаю в данном контексте имеется в виду "шум" компонентов (устройств компьютера) - данные с них и их частота поступления.
Вот представь, у меня есть комп P166MMX, на плате без датчиков температуры и скорости вращения вентиляторов. А /dev/urandom при этом работает.

Ладно. мы ушли в глубокий оффтопик.

Автор: MAKCim 24.9.2007, 15:52
comcon1, 
не знаю как насчет скорости вентилятора и температуры CPU (кстати, она мало подходит, т. к изменяется в общем случае в небольших пределах (или вообще не меняется при постоянной работе)), но точно знаю, что пул энтропии пополняется засчет:
1. Интервалов между прерываниями (в дескрипторе которых установлен флаг SA_SAMPLE_RANDOM)
2. Скан-кодов и интервалов между нажатиями клавиш
3. Позиции указателя мыши и интеравалов между прерываниями

Добавлено через 1 минуту и 45 секунд
Цитата(comcon1 @  24.9.2007,  13:23 Найти цитируемый пост)
если тебе нужно часто читать рандом, то где гарантия, что энтропия не кончится??

гарантии нет никакой
поэтому не следует слишком часто и много читать с /dev/random

Автор: Invisible_kid 24.9.2007, 22:41
ИМХО "в нармальном компе ничего "случайного" быть не может!")

Автор: Invisible_kid 25.9.2007, 10:33
...а вобще как мне кажется, самый нормальный рандом зависит от времени.., т.е. по кругу ганяются какие-то значения и в момент обращения к "рандому" выдается текущее,
т.е. получается чот вероятность у всех значений одинаковая, но тем не менее если пасадить за комп чела, который переодичекси будет вызывать "случайное" число, результы всегда бутут разные...

Автор: bsa 25.9.2007, 14:07
Invisible_kid, в том то и дело, что "число крутящееся по кругу" не случайно. Его можно вычислить, зная период обращения и начальное значение. А вот то, что оно берется в случайный момент времени и дает искомую случайность. Именно на этом принципе и основана работа этих /dev/(u)random - читай "число берется в тот момент, когда юзер нажал на кнопку".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)