Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » [deleted]

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[deleted]

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 08:54 28-11-2003 | Исправлено: gnu, 00:21 09-02-2006
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
int value=(int)(50.0*rand()/RAND_MAX);
 
где value={0,...,50}

Всего записей: 1439 | Зарегистр. 22-04-2002 | Отправлено: 11:28 28-11-2003
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если ты уже генеришь числа в диапазоне 1 -- RAND_MAX а нужно скажем от 0 до 50 включительно - используй остаток от деления rand на 51

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 16:30 28-11-2003 | Исправлено: redp, 16:33 28-11-2003
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp
Остаток от деления... не эффективно и жутко медленно. Придумал, вот:
 
Генерируем от 0 до RAND_MAX, делим на RAND_MAX+1, получая результат в виде числа с поавающей точкой, умножаем на желаемый верхний предел (Если желательно иногда получать число, равное верхнему пределу, то умножаем на "предел+1"), ответ переводим в целое усечением.

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 15:27 01-12-2003
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2gnu
операции с плавающей точкой намного медленнее простого div
так что предложенный мой алгоритм быстрее будет. На порядок примерно

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 18:32 01-12-2003
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
И что же ты придумал?
Ты хоть читаешь, что тебе пишут? Зачем тогда спрашивать?
 

Цитата:
int value=(int)(50.0*rand()/RAND_MAX);  
где value={0,...,50}  

 
redp
Скорее всего ты прав - меньше операций
 
Добавлено
gnu
Деля на RAND_MAX ты получаешь распредление [0,1]
а деля на RAND_MAX+1 - [0,0.999969482421875]
не корректно

Всего записей: 1439 | Зарегистр. 22-04-2002 | Отправлено: 18:49 01-12-2003 | Исправлено: sawamail, 18:55 01-12-2003
ghostwheel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Остаток от деления... не эффективно и жутко медленно. Придумал, вот:

 
На x86 процессорах, команда DIV вычисляет одновременно и частное и остаток. Так что использовать остаток (деление по модулю) гораздо эффективнее чем выполнять деление и умножение с плавающей точкой.
 
А вообще стандартные реализации rand() обычно дают весьма плохое распределение. Советую почитать Кнута и выбрать нужный генератор ПСЧ.

Всего записей: 7 | Зарегистр. 06-11-2003 | Отправлено: 00:23 04-12-2003
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ghostwheel
правильно говорит.
Сталкивался лично с необходимостью получения очень больших массивов случайных чисел, для нахождения самой оптимальной проверки цифровой цепи. Застряли на такой проблеме - генератор выдавал периодически те же самые числа. А комп за несколько дней расчётов поэтому и не выдал хороших результатов.

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 08:45 04-12-2003
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MetroidZ
ну дык что ты хотел... различные периоды...
все уприается в период.

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 01:34 07-12-2003 | Исправлено: gnu, 00:33 09-02-2006
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашёл юнит входящий в состав FUNDAMENTALS 3 - UTILITIES
cRandom.pas  -  Uniform random number generators.
Надо будет его попробовать.
В нём есть:
function  RandomUniform: LongWord; overload;
function  RandomUniform(const N: Integer): Integer; overload;
function  RandomBoolean: Boolean;
function  RandomInt64: Int64;
function  RandomHex(const Digits: Integer = 8): String;
function  RandomFloat: Extended;
function  RandomPseudoWord(const Length: Integer): String;
 
Хоть он на паскале, но думаю всем можно посмотреть. Тем более что исходный проект на C. Мне особенно нужен RandomBoolean.
------------------------------------------------------------------------------
Random number generator from ACM Transactions on Modeling and Computer        
Simulation 8(1) 3-30, 1990.
Supposedly it has a period of -1 + 2^19937.  
The original was in C; this translation returns the same values as the  
original.  It is called the Mersenne Twister.    
Bug fixes with reference to the original code
http://www.math.keio.ac.jp/~matumoto/emt.html
--------------------------------------------------------------------------------

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 16:44 07-12-2003
ghostwheel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu

Цитата:
Где про это можно почитать? Очень интересно...

 
Например здесь - http://www.intel.com/design/pentium4/manuals/245471.htm - в конце страницы ссылка на 7.5Mb PDF.
 
 

Всего записей: 7 | Зарегистр. 06-11-2003 | Отправлено: 22:42 08-12-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » [deleted]


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru