Создание упорядоченного массива случайных чисел
-
- Сообщения: 497
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
Naeel Maqsudov, и элементы массива уже нельзя считать случаными числами с равномерным распределением.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Строго говоря, нельзя. Между тем надо подождать, что скажет автор вопроса. Оба предложенных решения ведут себя хорошо при k<n, что составляло главную проблему.
Кстати, а что можно сказать о распределении величины, которая получалась по исходному алгоритму:
array+=random(10)?
Кстати, а что можно сказать о распределении величины, которая получалась по исходному алгоритму:
array+=random(10)?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
В формулировке выше была ошибка. P забыл прибавить.
Получилось пока вот что:
Распределение дает конечно же не навномерное. График, построенный по усредненным значениям на 50 опытах выглядит не как линейная функция, а скорее как SQRT(X)
Приблизить его к линейному (практически сделать его линейным) можно так:
Однако на массиве из 30 значений в 50 опытах этот алгоритм дает более нормальное распределение, чем просто функция Rnd. При увеличении размерности массива алгоритм будет давать результат все более и более близкий к обычной функции Rnd.
Вот.
Получилось пока вот что:
Код: Выделить всё
Sub Macro2()
K1 = 0: K2 = 1: N = 30: P = 0.5
xx = 0
For i = 0 To N - 1
x = xx + Rnd() * ((K2 - P) * (i + 1) / N + P - xx) + K1
ActiveCell.Offset(i, 0).Value = x
xx = x
Next
End Sub
Приблизить его к линейному (практически сделать его линейным) можно так:
Код: Выделить всё
Sub Macro2()
K1 = 0: K2 = 1: N = 30: P = 0.5
xx = 0
For i = 0 To N - 1
x = xx + Rnd() * ((K2 - P) * (i + 1) / N + P * (i + 1) / N - xx) + K1
ActiveCell.Offset(i, 0).Value = x
xx = x
Next
End Sub
Вот.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Хе-хе! Так и есть!
Последний алгоритм рулит!
на 26000 разницы между сортировкой готового массива из RND и последним алгоритмом не заметно.
Последний алгоритм рулит!
на 26000 разницы между сортировкой готового массива из RND и последним алгоритмом не заметно.
-
- Сообщения: 497
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
Увы, но это бездоказательно.... Меня лично ломает сидеть и вычислять....
И ещё!!!!
более нормальное распределение - осторожнее в формулировках.

более нормальное распределение - осторожнее в формулировках.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
На 30 значениях Random() дала среднее 0.591, а моя функция 0.525.
На достаточно большом количестве значений они реально позволяют получить чрезвычайно сходный результат.
Просто не знаю, с какой стороны и подступиться к доказательству....
На достаточно большом количестве значений они реально позволяют получить чрезвычайно сходный результат.
Просто не знаю, с какой стороны и подступиться к доказательству....
-
- Сообщения: 497
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
Усреднение численное - это - увы - не доказательство. А как такие штуки доказывать - у Феллера описано.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
Naeel Maqsudov, Выражаю тебе свою благодарность.
X[-1]=0
i=0..N-1:
X=X[i-1]+random((Kmax-P)*(i+1)/N-X[i-1])+Kmin
Этот алгоритм работает для большинства условий, только приходится слегка поработать с вещественными типами. Кстати говоря, гланая проблема сортировки - перемещение элементов. Во-первых структура, во-вторых на винчестере.
X[-1]=0
i=0..N-1:
X=X[i-1]+random((Kmax-P)*(i+1)/N-X[i-1])+Kmin
Этот алгоритм работает для большинства условий, только приходится слегка поработать с вещественными типами. Кстати говоря, гланая проблема сортировки - перемещение элементов. Во-первых структура, во-вторых на винчестере.
Крылья есть у всех -
У каждого свой путь наверх!
У каждого свой путь наверх!