Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Мой вариант генератора случайных неповторяющихся чисел.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
OnLine1488



Зарегистрирован: 22.11.2006
Сообщения: 8
Откуда: П-Кам

СообщениеДобавлено: Ср Ноя 22 2006 07:05    Заголовок сообщения: Мой вариант генератора случайных неповторяющихся чисел. Ответить с цитатой

void CGenerDlg::OnButton1()
{
/* time - интОвая переменка - получает процессорное время
благодаря подключению файлика time.h и использованию
команды clock(), к счастью процессорное время всегда разное,
тем самым засунув его в закон генерации, мы будем получать
всегда разную последовательность*/

time = clock();
srand(time);

/* с этим порешали, т.е. у нас теперь не псевдослучайные числа, а фактически просто случайные числа
далее осталось сделать так, чтоб в заданном диапазоне числа не вздумали вдруг повторяться*/

t_mas = 4; // переменная которая буде подавать в массив t и нарсчиватца
t[0] = 0; //
t[1] = 0; //
t[2] = 0; // забиваем первые пять элементов массива
t[3] = 0; // без этого прога почему-то виснит сцука Smile
t[4] = 0; //

/* ну и всё, забиваем каждый раз сгенерерённое значени в массивчик t и потом сравниваем са всеми членами*/
for(int i=1; i<=5; i++)
{
t_mas++;
do{
a = rand() % 10;
}while(a == t[t_mas - 1] || a == t[t_mas - 2] || a == t[t_mas - 3] || a == t[t_mas - 4]);
t[t_mas] = a;
parametr = a;
CString strok;
strok.Format(" %d", parametr);
MessageBox(strok,NULL,MB_OK);
}

}


Я конечно может всё совково придумал, но вообще я неочень грамотный пользователь С++
А вообще хотел задать такой вопрос, если кто знает...
Верней даже не вопрос...
Кто может подкинуть ссылку на материал как через С++ работать с SQL2000, на учебник или советы полезные и т.п.
Буду премного благодарен.
_________________
Рейху волчьей тени - Тысяча имён!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Denjs



Зарегистрирован: 29.08.2003
Сообщения: 137

СообщениеДобавлено: Ср Ноя 22 2006 10:41    Заголовок сообщения: Ответить с цитатой

а графики распределение массива твоих случайных чисел ты строил?
исследовал твою функцию на различные "математические свойства"? а при каких параметрах?

если твоя функция не "равномернораспределена" то это вообще "поганенько".

сгенерируй массивы чисел, с построй графики распределения. потом думай. навдруг у тебя числа в периоде от 8 до 10 выпадают в 3 раза чаще чем числа от 1 до 8 на интервале от 1 до 10?

теория получения псевдослучайных чисел не от хорошей жизни придумана. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Ср Ноя 22 2006 13:33    Заголовок сообщения: Ответить с цитатой

Уржаться!!!

Получает процессорное время. Я так понимаю речь идет о системной таймере, который обновляется примерно 18 раз в секунду. Если мне нужно в секунду получать 1 000 000, вполне встречаемая задача... Я уж и не говорю про скорость такого генератора.

Генерацией случайных чисел большие дяденьки в серьезных институтах занимаются. Действительно быстрый генератор с равномерным распределением и плохой предсказуемостью может дорого стоить.
_________________
Самоловских Виталий aka Kefir
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Denjs



Зарегистрирован: 29.08.2003
Сообщения: 137

СообщениеДобавлено: Ср Ноя 22 2006 15:44    Заголовок сообщения: Ответить с цитатой

Kefir писал(а):
<...>
Генерацией случайных чисел большие дяденьки в серьезных институтах занимаются. Действительно быстрый генератор с равномерным распределением и плохой предсказуемостью может дорого стоить.

я даже больше скажу - как я понимаю, параметры хороших генераторов приравниваются к гос-тайне )))
__________________________________________
не в обиду автору, но надо бы теорию подучить.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
next



Зарегистрирован: 20.11.2006
Сообщения: 28

СообщениеДобавлено: Ср Ноя 22 2006 16:10    Заголовок сообщения: Ответить с цитатой

Ребята, не разрушайте его наивность, может он потом свой "рандомайзер" кому-нибудь в релизную версию серьезной софтины засунет. А уж мы его потом заэксплоитим Laughing

OnLine1488, иди в Micro$oft, там любят самоделкиных. Чуть ли не в каждой их софтине (исключая лицензированные) есть супер-homebrew генератор или шифровальщик: "лучшее за два часа кодинга в два часа ночи".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Ср Ноя 22 2006 16:33    Заголовок сообщения: Ответить с цитатой

Denjs писал(а):

я даже больше скажу - как я понимаю, параметры хороших генераторов приравниваются к гос-тайне )))

Ну естественно, от генератора случайных чисел зависит стойкость многих криптопротоколов.

А неповторяемость за 5 шагов - просто смешно....
_________________
Самоловских Виталий aka Kefir
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
ac



Зарегистрирован: 22.11.2006
Сообщения: 10

СообщениеДобавлено: Ср Ноя 22 2006 17:09    Заголовок сообщения: Ответить с цитатой

как раз вчра генерил себе пару - открытый/закрытый RSA-ключ. Весь процесс занял около минуты, причем секунд 59 из них система (GnuPG) генерила именно случайные числа. Причем, на экран софтина периодически выводила сообщение, смысл которого был - нажимайте активнеее кнопки, двигайте больше мышью для получения наилучшей энтропии. Наверное, перцы, изобретающие крипто алгоритмы, уже несколько собак съели на генерации случ. чисел...
OnLine1488, ты бы хоть почитал чтоли по этому поводу чего... да и в учебных заведениях (преимущественно высших) о случайных процессах и выборках довольно популярно толкуют... Заканчивай писать рандомайзер за счет лекций Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
OnLine1488



Зарегистрирован: 22.11.2006
Сообщения: 8
Откуда: П-Кам

СообщениеДобавлено: Чт Ноя 23 2006 00:10    Заголовок сообщения: Ответить с цитатой

Я по доброму смеялся, застебали по полной...
Но собственно лекции мои уже давно закончились (это мне на работе поручили тест написать), а данная "недосистема" свою задачу выполнила, а стояла перед ней задача, фанарным образом подбирать вопросы в тесте, а также и варианты ответов на него тоже выдавать каждый раз в разном порядке...
..так что, как видите, чисто для исследования генерации чисел, выше приведенный код не предназначен.
А тест в полне ничего получился, просто хотел сказать, что для задачи такого недалёкого уровня такой "генератор чисел" в полне сгодися.
_________________
Рейху волчьей тени - Тысяча имён!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Чт Ноя 23 2006 07:12    Заголовок сообщения: Ответить с цитатой

OnLine1488 писал(а):

А тест в полне ничего получился, просто хотел сказать, что для задачи такого недалёкого уровня такой "генератор чисел" в полне сгодися.


А стандартный чем не устроил? Инициализируешь его от того же таймера, и ближайшие несколько миллиардов повторений не будет, ну или сколько там надо.

Джошуа Блох: "Изучите стандартные библиотеки и используйте их."

Программеры в Борланде том же, уж наверно не ламо какое-нибудь. Хотя не знаю как дела с генерацией псевдослучайных чисел обстоят в том же билдере. Но есть стандартная функция ANSI C random(int n), кажется, которая выдает числа от нуля до n с равномерным распределением.
_________________
Самоловских Виталий aka Kefir
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
ac



Зарегистрирован: 22.11.2006
Сообщения: 10

СообщениеДобавлено: Чт Ноя 23 2006 12:11    Заголовок сообщения: Ответить с цитатой

Kefir писал(а):

Но есть стандартная функция ANSI C random(int n), кажется, которая выдает числа от нуля до n с равномерным распределением.

Вот и я о том же... нафига изобретать в сотый раз лисапед? Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Чт Ноя 23 2006 13:02    Заголовок сообщения: Ответить с цитатой

Может подскажет кто, раз уж такая тема закрутилась, как, наиболее правильно организовать генерацию случайных чисел под неравномерное распределение. Гаусово, например, или, в идеале, под произвольную (отнормированную, чтобы интеграл от а до б был равен 1) функцию.

О языке не говорю, желательно PASCAL, хуже DELPHI.

Лучше обсудить алгоритм. Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Чт Ноя 23 2006 13:03    Заголовок сообщения: Ответить с цитатой

Может подскажет кто, раз уж такая тема закрутилась, как, наиболее правильно организовать генерацию случайных чисел под неравномерное распределение. Гауссово, например, или, в идеале, под произвольную (отнормированную, чтобы интеграл от а до б был равен 1) функцию.

О языке не говорю, желательно PASCAL, хуже DELPHI.

Лучше обсудить алгоритм. Wink

На данный момент я использую равномерное распределение и метод Монте-Карло. Но может есть что-то лучшее.

Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Denjs



Зарегистрирован: 29.08.2003
Сообщения: 137

СообщениеДобавлено: Чт Ноя 23 2006 14:42    Заголовок сообщения: Ответить с цитатой

grf писал(а):
Может подскажет кто, раз уж такая тема закрутилась, как, наиболее правильно организовать генерацию случайных чисел под неравномерное распределение. Гауссово, например, или, в идеале, под произвольную (отнормированную, чтобы интеграл от а до б был равен 1)

ноу проблем) вспоминаем институтские лекции Wink
по чему уже непомню... что то связанное отдаленно с высшей математикой (все оттуда вышло)... курс 3-й или 4-й....

за термины не судите - пишу по памяти.. но суть верная.
-----------------------------
имеем - функция нужного нам распределения случайной величины f(x) (непрерывная интегрируемая функция. естественно она "отнормированная" ).
также имеем равномерно распределенную случайную величину Y1 . под y1 (определённую на интервате от 0 до 1. естественно тоже "нормированную"(?)) ("y1-маленькое" будем понимать конкретное значение этой функции "в какойто из опытов")

задача - получить "x1" - ("х1-маленькое" - реализация случайного значения X1 которое распределено по закону f(x))

решение: интегрируем функцию f(x) (надеюсь все помнят как брать интегралы?). получаем функцию F(x)=y. далее - выражаем x из этой функции. получаем x=F`(y).

Теперь, если реализации y1 подставлять в F`(y) будем получать значения x1 которые распределены по закону f(x)
т.е. x1=F`(y1).

все.

============
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Чт Ноя 23 2006 18:08    Заголовок сообщения: Ответить с цитатой

Нет, далеко не все.

1. поясните, что значит:
интегрируем функцию f(x) (надеюсь все помнят как брать интегралы?). получаем функцию F(x)=y.

Нет. Что за у. как брать интеграл.

Есть функция распределения от - inf до + inf

введу термины Laughing
inf - бесконечность
int - интеграл
int|a,b{f(x)} определенный интеграл от а до b от функции f(x)

Вы имеете ввиду y=int|-inf,x{f(x)} ???

2. далее - выражаем x из этой функции. получаем x=F`(y).
Какой Вы ловкий и смелый Laughing Не выражается одно из другого, например:

y=ax**7+bx**6+.....m

а есть случаи и посложнее.


3. Теперь, если реализации y1 подставлять в F`(y) будем получать значения x1 которые распределены по закону f(x)

Пока для меня совсем не очевидный факт Embarassed . может и туплю. Laughing

Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Denjs



Зарегистрирован: 29.08.2003
Сообщения: 137

СообщениеДобавлено: Чт Ноя 23 2006 18:51    Заголовок сообщения: Ответить с цитатой

grf писал(а):
Нет, далеко не все.
1. поясните, что значит:
интегрируем функцию f(x)
Что за у. как брать интеграл.

функция f(x)=y.
Интегрирование - взятие игтеграла - действие обратное взятию производной. и то и другое рассказывается в основах высшей математики.
Геометрический смысл интегрирования - нахождение функции F(x) которая отображает зависимость площади под кривой функции f(x) на участке от нуля до х.

со всем остальным... увы.. както не внятно на мой взглад вами описано...
сечас подумаю с полчаса.. может пример напишу.

я вам теорию рассказал ) она работает.
пояснить её смысл проще всего в графиках, но рисовать и размещать здесь... затруднительно. попозже ченить придумаем )))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
next



Зарегистрирован: 20.11.2006
Сообщения: 28

СообщениеДобавлено: Чт Ноя 23 2006 23:13    Заголовок сообщения: Ответить с цитатой

возможно вы сможете рассказать про метод монте карло, раз уж про интегралы речь зашла?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Пт Ноя 24 2006 11:38    Заголовок сообщения: Ответить с цитатой

Спасибо, что разъяснили мне, что такое интеграл Laughing

Цитата:
Интегрирование - взятие игтеграла - действие обратное взятию производной. и то и другое рассказывается в основах высшей математики.


Вообще то меня учили в институте, что интеграл - это предел суммы Римана, но может они ошибались. Embarassed
Да и про константу что-то ни слова.



Цитата:
Геометрический смысл интегрирования - нахождение функции F(x) которая отображает зависимость площади под кривой функции f(x) на участке от нуля до х.


Т.е. если дана функция у(x)=x*x

Найти площадь под кривой, при x принадлежащему отрезку [-1;1] для Вашей высшей математики непосильная задача. только если x принадлежит [0;1] Laughing

А без шуток, разобрался я с Вашими функциями.
Вы немного ошиблись. Мы говорим о генераторе случайных чисел с неравномерным распределением, это распределение задается функцией f(x), а Вы говорите о вероятности нахождения величины в диапазоне от 0 (раз уж Вам так понравился 0) до x.

К тому же Ваш метод имеет существенные недостатки, такие, как необходимость обратного преобразования, помните из

y=F(x) в x=F'(y)

Во первых существуют функции, которые вообще не заданы явно, например функция Бесселя, которая очень широко используется в описаниях многих физических процессов, например в распределении потоков нейтронов на АЭС.
Во вторых, даже, если мы опишем эту функцию в явном виде, то нам каждый раз придется решать уравнение, которое можект быть весьма сложным и не простым.

Wink

Вернемся к генератору случайных чисел.

Метод, который предполагаю использовать я.

Пусть есть функция распределения f(x).
х принадлежит отрезку [a;b]

максимум этой функции на этом отрезке равен с

Генератором случайных чисел генерим два числа m и n, такие, что

m принадлежит отрезку [a;b]
n принадлежит отрезку [0;d], где d любое число, определенное один раз и удовлетворяющие условию d>=c

(Практически заключаем нашу функцию распределения в прямоугольную область (a,0) (b,d) - координаты угловых точек)

если выполняется условие f(m)>=n, то принимаем число m как случайную величину, для дальнейшего использования, если f(m)<n, то забиваем на эту пару чисел и генерим новую пару m и n.

Wink

Жду ваших предложений. Laughing
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Denjs



Зарегистрирован: 29.08.2003
Сообщения: 137

СообщениеДобавлено: Пт Ноя 24 2006 11:59    Заголовок сообщения: Ответить с цитатой

ну.. метод монте-карло и есть ))
Цитата:
Вы немного ошиблись. Мы говорим о генераторе случайных чисел с неравномерным распределением, это распределение задается функцией f(x), а Вы говорите о вероятности нахождения величины в диапазоне от 0 (раз уж Вам так понравился 0) до x.

я как раз говорю о генераторе случайных чисел Wink

давайте попробуем представить себе график интегральной функции F(x).
он непрерывно растет от 0 до 1 на промежутке от 0 до хmax (или уж по крайней мере не уменьшается ("не уменьшается" - на тех участках где функция распределения=0); а участок от 0 до хmax - это период на котором задана функция распределения случайной величины - f(x) ).

Равномерно-распределенная случайная величина Y1 , определенная на отрезке от 0 до 1- дает нам число y1 в каком-то из опытов .
Берем график интегральной функции F(x), откладываем y1 по вертикальной оси; далее ведем "горизонтальную прямую" до пересечения с графиком. - (т.е. ищем икс, при котором наша F(x) дает нам полученный y1; или ищем точку (y1,x)... т.е. делаем руками то что должна бы сделать подстановка x=F`(y1) ...)

x который мы получим, он будет одной из координат точки пересечения - и будет нашей ископой случайной величиной.
при множестве опытов - мы наберем массив чисел (состоящий из значений x) распределенный по закону изначальной функции - f(x)

=====================================
а проблемы взятия интегралов и выражения чего-либо т.п. - это уже совершенно иные проблемы ; на крайний случай, если мы не можем что-то выразить или взять интеграл - есть множество численных методов для получения конкретных значений интегральной функции. Wink

=====================================
"ваш метод имеет очевидные недостатки"...

Каждый метод имеет определенные "недостатки". метод монте-карло - не позволяет с заданной скоростью получать поток случайных чисел - в среднем около половины (зависит от заданного графика распределения) отбрасывается. через сколько циклов - вы получите новое число - неизвестно. может через 3 а может и через 5. и к тому же он как минимум более чем в 2 раза "вычислительно-емок"- мы должны получать 2 случаный числа для получения одного - т.е скорость получения чисел методом монте-карло как минимум в 2 раза ниже чем описанный метод "преодбразования" с помощью "интегральной функции".
можно подозревать, что "вычисление преобразования через обратную функцию F`(y)"- это "дольше", но эти вычисления можно оптимизировать как минимум с помощью численных методов, предварительного расчета значений функции, и т.д. - а вот алгоритмов ускоренния получения псевдослучайных чисел я не помню...

описанное мною - имеет "недостатки" только "математического плана" - связанные с трудностью взятия интегралов и т.п. т.е. трудности человеческого плана - и это трудности которые мы должны решить 1 раз, но в результате мы будем иметь гарантированный поток - столько-то чисел в единицу времени.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Пт Ноя 24 2006 17:27    Заголовок сообщения: Ответить с цитатой

Цитата:
я как раз говорю о генераторе случайных чисел


Да. Вы правы. Немного не правильно рисовал последний график, откуда и получил неверный вывод. Embarassed Laughing

Что касается недостатков обоих методов, то они, конечно есть. Laughing

Ваш метод будет особенно оправдан при наличии распределения с одним или несколькими острыми пиками. Спасибо.

Есть ли еще алгоритмы получения генератора случайных чисел с неравномерным распределением.

Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...