Создание упорядоченного массива случайных чисел

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Naeel Maqsudov, и элементы массива уже нельзя считать случаными числами с равномерным распределением.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Строго говоря, нельзя. Между тем надо подождать, что скажет автор вопроса. Оба предложенных решения ведут себя хорошо при k<n, что составляло главную проблему.


Кстати, а что можно сказать о распределении величины, которая получалась по исходному алгоритму:
array+=random(10)?
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

слёту - ничего :)
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

В формулировке выше была ошибка. P забыл прибавить.
Получилось пока вот что:

Код: Выделить всё

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

Распределение дает конечно же не навномерное. График, построенный по усредненным значениям на 50 опытах выглядит не как линейная функция, а скорее как SQRT(X)

Приблизить его к линейному (практически сделать его линейным) можно так:

Код: Выделить всё

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

Однако на массиве из 30 значений в 50 опытах этот алгоритм дает более нормальное распределение, чем просто функция Rnd. При увеличении размерности массива алгоритм будет давать результат все более и более близкий к обычной функции Rnd.

Вот.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Хе-хе! Так и есть!
Последний алгоритм рулит!
на 26000 разницы между сортировкой готового массива из RND и последним алгоритмом не заметно.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Увы, но это бездоказательно.... Меня лично ломает сидеть и вычислять.... :) И ещё!!!!
более нормальное распределение - осторожнее в формулировках.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

На 30 значениях Random() дала среднее 0.591, а моя функция 0.525.
На достаточно большом количестве значений они реально позволяют получить чрезвычайно сходный результат.
Просто не знаю, с какой стороны и подступиться к доказательству....
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Усреднение численное - это - увы - не доказательство. А как такие штуки доказывать - у Феллера описано.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
AMDemon
Сообщения: 24
Зарегистрирован: 18 ноя 2005, 21:09
Откуда: Брянск

Naeel Maqsudov, Выражаю тебе свою благодарность.

X[-1]=0
i=0..N-1:
X=X[i-1]+random((Kmax-P)*(i+1)/N-X[i-1])+Kmin

Этот алгоритм работает для большинства условий, только приходится слегка поработать с вещественными типами. Кстати говоря, гланая проблема сортировки - перемещение элементов. Во-первых структура, во-вторых на винчестере.
Крылья есть у всех -
У каждого свой путь наверх!
Ответить