Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как реализовать нормальный рандом в gcc??? 
:(
    Опции темы
MrCherry
Дата 24.9.2007, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



Код

#include <iostream>
using namespace std;

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


допустим такой код, как сделать чтобы rand всегда выдавал случайное значение?
PM MAIL   Вверх
MAKCim
Дата 24.9.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

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



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 24.9.2007, 09:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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;
}

PM   Вверх
MrCherry
Дата 24.9.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



ой плин... спасибо bsa... 
теперь вопрос на миллион.. почему эта штука заставляет комп пищать при выводе cout << a; ? 
PM MAIL   Вверх
bsa
Дата 24.9.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



потому что есть символ такой BELL (звонок). Если не ошибаюсь, у него код 0x07. cout << a, когда a - это переменная типа char выводится не число, а символ, код которого содержит a.
PM   Вверх
comcon1
Дата 24.9.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 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

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


--------------------
PM MAIL   Вверх
bsa
Дата 24.9.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Откуда такие сведения?
PM   Вверх
comcon1
Дата 24.9.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Цитата

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

Это сообщение отредактировал(а) comcon1 - 24.9.2007, 12:38


--------------------
PM MAIL   Вверх
bsa
Дата 24.9.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

PM   Вверх
comcon1
Дата 24.9.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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


--------------------
PM MAIL   Вверх
bsa
Дата 24.9.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Ладно. мы ушли в глубокий оффтопик.
PM   Вверх
MAKCim
Дата 24.9.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



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

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Invisible_kid
Дата 24.9.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



ИМХО "в нармальном компе ничего "случайного" быть не может!")
PM MAIL   Вверх
Invisible_kid
Дата 25.9.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



...а вобще как мне кажется, самый нормальный рандом зависит от времени.., т.е. по кругу ганяются какие-то значения и в момент обращения к "рандому" выдается текущее,
т.е. получается чот вероятность у всех значений одинаковая, но тем не менее если пасадить за комп чела, который переодичекси будет вызывать "случайное" число, результы всегда бутут разные...
PM MAIL   Вверх
bsa
Дата 25.9.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Invisible_kid, в том то и дело, что "число крутящееся по кругу" не случайно. Его можно вычислить, зная период обращения и начальное значение. А вот то, что оно берется в случайный момент времени и дает искомую случайность. Именно на этом принципе и основана работа этих /dev/(u)random - читай "число берется в тот момент, когда юзер нажал на кнопку".
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.