Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];

Вниз

случайный ряд   Найти похожие ветки 

 
мс_анатолий   (2009-05-08 10:04) [0]

Уважаемый мастера.
Скажите как быстрее получить случайный ряд,
если известны Min,Max, число значений в ряду, среднее арифметическое, хотя бы с 2 знаками после запятой.
Заранее спасибо.
double sum = 0;
double MeanA = 0; //получаемое среднее
double Mean - известное среднее
Array[j] - массив с известным числом записей
Count - число записей

while (Mean != MeanA)
{
 sum = 0;
 for (unsigned int j = 0; j < Count; j++)
 {
  Array[j] = GetRandomValue(Min,Max);
  sum+=Array[j];
 }
 MeanA = sum / Count;
}


 
KSergey ©   (2009-05-08 10:45) [1]

наверное такой подход даст результат, только вот это условие надо переработать.

while (Mean != MeanA)

При переработке думать вот о чем:
1) Два double числа очень вероятно не равны друг другу, даже если на экране и выглядят одинаково
2) фраза "хотя бы с 2 знаками после запятой" - она не просто так написана в задании. И она ка краз не учтена в реализации, что приводит к неработоспособности. Надо ее реализовать - и счастье будет.


 
KSergey ©   (2009-05-08 10:46) [2]

по п.1) читать тут
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
Jeer ©   (2009-05-08 11:23) [3]


> если известны Min,Max, число значений в ряду, среднее арифметическое,
>  хотя бы с 2 знаками после запятой.


Если заданы Min и Max, то среднее арифметическое ( мат.ожидание ) уже автоматом получается. При условии, конечно, что распределение симметрично.


 
Franzy   (2009-05-08 11:57) [4]

Создаем массив из случайных чисел в интервале от min до max из нужного кол-ва чисел, а затем вычитаем/прибавляем (так, чтобы не выходить за пределы отрезка) к элементам массива поправки, чтобы получить нужное матожидание.  Случайное число + константа - это ведь тоже случайное число ;)


 
KSergey ©   (2009-05-08 12:00) [5]

> Jeer ©   (08.05.09 11:23) [3]
> При условии, конечно, что распределение симметрично.

Такого условия в задаче нет. Зачем выдумывать?


 
Franzy   (2009-05-08 12:01) [6]

З.Ы. Ваш алгоритм не подходит, потому что длина ряда задана, а мой это учитывает.


 
Дуб ©   (2009-05-08 12:03) [7]

Array[j] = Mean

И пусть докажут, что это не случайная последовательность.


 
Franzy   (2009-05-08 12:09) [8]

2Дуб
Не сработает, если членов ряда мало.


 
Дуб ©   (2009-05-08 12:13) [9]


> Franzy   (08.05.09 12:09) [8]

? а что именно не сработает? Среднее будет меньше или как?


 
Franzy   (2009-05-08 12:31) [10]

Вру. Сработает при любом кол-ве, но ряд получится странный. Случайным в ем будет только первое число. Второе должно быть равно 2M-A(1). А третье и все последующие будут равны M. Формально такой ответ, мб, и подходит, а вот по сути - нет.


 
Дуб ©   (2009-05-08 12:34) [11]

> Franzy   (08.05.09 12:31) [10]

А по сути там и не получится. Ибо элементы ненезависимы. Их сумма задана:)


 
Jeer ©   (2009-05-08 12:39) [12]


> KSergey ©   (08.05.09 12:00) [5]
>
> > Jeer ©   (08.05.09 11:23) [3]
> > При условии, конечно, что распределение симметрично.
>
> Такого условия в задаче нет. Зачем выдумывать?


Стандартные функции генерации дают симметричное распределение.
Не в курсе ?


 
TUser ©   (2009-05-08 13:33) [13]

Кнут, т.3


 
Дуб ©   (2009-05-08 13:38) [14]


> TUser ©   (08.05.09 13:33) [13]

случайные - они во втором.


 
Franzy   (2009-05-08 14:09) [15]

По сути там N-1 случайных чисел, +1, которое получается из суммы остальных. Чувствуете разницу между 1 случайным и N-1, которые получаются из него?


 
Чайник ©   (2009-05-08 14:10) [16]

Задача не так проста, как кажется.
Обратите внимание - "известны Min,Max, число значений в ряду, среднее арифметическое".
Если принять равномерное распределение случ.чисел в ряду, то
среднее арифметическое ~ (Min+Max)/2

Если же задано среднее арифметическое "хотя бы с 2 знаками после запятой", значит явно предполагается неравномерное распределение. Мне кажется, вся педагогическая соль этого задания в том и состоит, чтобы найти соответствующую функцию для закона распределения сл.чисел в ряду.


 
Чайник ©   (2009-05-08 14:14) [17]

АЛГОРИТМ ГЕНЕРАЦИИ СЛУЧАЙНОЙ ВЕЛИЧИНЫ, ПОДЧИНЯЮЩЕЙСЯ ЗАДАННОМУ ЗАКОНУ РАСПРЕДЕЛЕНИЯ -
http://ps300.narod.ru/fr3d/prob.htm


 
Сергей М. ©   (2009-05-08 14:21) [18]


> Задача не так проста, как кажется


У автора кривой язык.

Он, похоже, не в состоянии построить правильно предложение с изложением ИД, которое должно было прозвучать так:

Получить ряд из заданного количества случайных чиcел, принадлежащих заданному диапазону значений, и расчитать среднее арифметическое членов полученного ряда с точностью до 2-х знаков после запятой.


В такой формулировке задача предельно понятна и тривиальна в решении.


 
Чайник ©   (2009-05-08 14:25) [19]

> У автора кривой язык.

Ну тады ой - велик могучим русских языков!


 
Franzy   (2009-05-08 14:28) [20]

2Сергей М.
Вам бы в политику, уважаемый :) "Вы задали неправильный вопрос, правильно было спросить вот так". В вашей постановке задача тривиальна, но это ДРУГАЯ задача.

Соль в том, что заданы мин, макс, кол-во и среднее ряда. И нужно составить массив, удовлетворящий данным условиям с заданной точностью.


 
palva ©   (2009-05-08 14:30) [21]


> Дуб ©   (08.05.09 12:03) [7]

дал исчерпывающий и единственный ответ для такой постановки задачи. Обратите внимание, что задано не мат. ожидание членов ряда, а среднее арифметическое ряда. То есть, если считать члены ряда одинаково распределенными случайными величинами, то единственным распределением, которое удовлетворяет условию задачи будет дискретное распределение с одним состоянием равным Meen.


 
palva ©   (2009-05-08 14:32) [22]

Любое другое распределение даст случайность среднего арифметического, что противоречит условию задачи.


 
Franzy   (2009-05-08 14:33) [23]

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


 
Franzy   (2009-05-08 14:37) [24]

2palva

Вот вам случайный массив, который удовлетворяет всем условиям задачи, но распределtние у него не mean:

1 3 6 2
(N=4, min =0, max =10, Mean = 3)


 
Сергей М. ©   (2009-05-08 14:46) [25]


> Franzy   (08.05.09 14:28) [20]



> заданы мин, макс, кол-во и среднее ряда. И нужно составить
> массив, удовлетворящий данным условиям с заданной точностью


Какой массив-то ? Их же будет множество , каждый из которых удовлетворяет таким условиям..


 
palva ©   (2009-05-08 14:51) [26]

Сдается мне, мы друг друга не понимаем. Вы задали числовой ряд, то есть реализацию случайного ряда, а не распределение его членов.
Вы можете указать распределение, которому подчиняются его члены?
Ну типа: 1 с вероятностью 0.2, 2 с вероятностью 0.3, 3 с вероятностью 0.2, 6 с вероятностью 0.3. Что бы вы ни задали, среднее арифметическое не будет равно 3 с вероятностью единица.


 
Franzy   (2009-05-08 14:55) [27]

Короче, алгоритм:
Пусть заданы MIN, MAX, N, MEAN, EPS (требуемая точность)

1) Составляем массив A из N случайных чисел из интервала [MIN,MAX]
2) Вычисляем ср. арифм массива = X
3) Пускаем цикл, выполняющийся, пока не будет выполнено условие abs(X-MEAN)<=EPS. Внутри цикла:
3.1 Вычисляем невязку Y=(MEAN-X)*N;
3.2 Выбираем случайный элемент массива (i). Делаем A(i) =A(i)+Y
3.3 Проверяем выход за пределы интервала: если A(i)>MAX, то A(i)=MAX; если A(i)<MIN, то A(i)=MIN
3.4 Вычисляем новое среднее X.

По-моему, предельно просто, быстро и эффективно. Быстрее будет только если запоминать уже измененные элементы массива и больше их не использовать (они и так уже будут максимизированы/минимизированы). Экстремалы вообще могут не случайный выбор использовать, а по порядку перебирать :)

З.Ы. Если MEAN не принадлежит интервалу [MIN,MAX], алгоритм уйдет в бесконечный цикл, иначе подходящий массив будет составлен не более чем за N итераций (в самом худшем случае).


 
Franzy   (2009-05-08 14:58) [28]


> Сдается мне, мы друг друга не понимаем. Вы задали числовой
> ряд, то есть реализацию случайного ряда, а не распределение
> его членов.


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


 
palva ©   (2009-05-08 15:20) [29]


> требуется написать процедуру, которая выдает такие случайные ряды

Дуб вам уже дал такую процедуру, которая гораздо проще и к тому же дает равенство Mean и среднего арифметического абсолютно точно. Если допускается погрешность для Mean и требовалась бы ненулевая дисперсия, то тоже существует гораздо более простая процедура порождения ряда, - это брать члены согласно равномерному распределению на отрезке [Mean-Eps, Mean+Eps]. Но ненулевой дисперсии в задаче не требуется.


 
MBo ©   (2009-05-08 15:30) [30]

Вот такая забавная фигня получается пока.


 procedure FillRandomSum(var A: array of Double; AMin, AMax, AMean: Double);

   procedure FillR(L, R: Integer; ASum: Double);
   var
     SL, SR: Double;
     M, NL, NR: Integer;
     MinL, MaxL: Double;
   begin
     if L = R then
       A[L] := ASum
     else begin
       M := (L + R) div 2;
       NL := M - L + 1;
       NR := R - M;
       MinL := Max(NL * AMin, ASum - NR * AMax);
       MaxL := Min(NL * AMax, ASum - NR * AMin);
//пляски с бубном и ненаучным тыком для получения более-менее равномерного распределения
       repeat
         SL := RandG((MaxL + MinL)/2, (MaxL - MinL)/(NL*Sqrt(NL)));
       until (SL >= MinL) and (SL <= MaxL);
       SR := ASum - SL;
       FillR(L, M, SL);
       FillR(M + 1, R, SR);
     end;
   end;

 var
   i, j: Integer;
   Temp: Double;
 begin
   FillR(0, High(A), AMean * Length(A));
//перемешаем
     for i := High(A) downto 1 do begin
       Temp := A[i];
       j := Random(i + 1);
       A[i] := A[j];
       A[j] := Temp;
     end;
 end;


 
palva ©   (2009-05-08 15:55) [31]

Franzy
Давайте, кстати, разберем ваш алгоритм. Дает он одинаково распределенные величины? Конечно дает. Каким будет распределение вероятности? Попробуем вычислять плотность эмпирически, частотно. Разобьем [Min, Max] на небольшие отрезки и будем подсчитывать частоту попаданий в каждый отрезок. В пределе при стремлении к бесконечности мы получим плотность распределения. Так вот, ненулевая плотность получится только на отрезках покрываемых отрезком [Mean-Eps, Mean+Eps] в противном случае была бы ненулевая вероятность выхода среднего арифметического за пределы этого отрезка.

В то же время любая плотность вероятности, носитель которой покрывается отрезком [Mean-Eps, Mean+Eps] удовлетворяет условию задачи. Конечно, здесь остается следующий парадокс: случайная величина у нас может принимать какое-то значение на отрезке, на который она должна попадать с нулевой вероятностью. Но таких парадоксов в теории вероятностей пруд пруди.


 
Franzy   (2009-05-08 16:07) [32]


> Дуб вам уже дал такую процедуру, которая гораздо проще и
> к тому же дает равенство Mean


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


 
palva ©   (2009-05-08 16:16) [33]


> Практический смысл такого ряда?

Я согласен, что у вас гораздо больше здравого смыла, чем у меня. Но с другой стороны, разве автор объяснил нам практический смысл? Зачем он скрестил случайные величины и фиксированное среднее арифметическое? Почему он не взял мат.ожидание? Вы же пресекли попытки объяснить автору, чего он на самом деле хочет. А идиотски поставленная задача имеет идиотское решение.


 
Franzy   (2009-05-08 17:06) [34]

Будучи преподом, принимающим у студентов лабы по информатике, я научился воспринимать объяснения в любых, самых идиотских вариантах :)


 
Дуб ©   (2009-05-09 04:19) [35]

> Franzy   (08.05.09 16:07) [32]
> Да, но она выдает нужный результат лишь формально, а не
> по сути. Случайным будет лишь первое число ряда. А последние
> и вовсе все одинаковые будут. Практический смысл такого
> ряда?

Очень простой - он верен. В любом другом случае будет совершенно элементарно показать, что получаемый вами массив вовсе не совсем случаен - за подробностями к Кнуту, например. О чем вам и толкует и пробует объяснить palva.

Есть простые иилюстрации к подобному.

> Franzy   (08.05.09 17:06) [34]
> Будучи преподом, принимающим у студентов лабы по информатике,
>  я научился воспринимать объяснения в любых, самых идиотских
> вариантах :)

Значит тут совершенно другая задача, не та что в сабже. Правильнее сформулировать задачу так: помогите мне написать нечто по приведенному, чтобы прокатило у обычного препода информатики, который и дал задачку - зачет.

Тогда да, тогда мой вариант отпадает, безусловно. :)

> Да, но она выдает нужный результат лишь формально, а не
> по сути.

Вот как? 2*2=4 это формально, а по сути понятно 5.

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

Ну и? Вы хотите к случайным последовательностям применить критерии обсуждаемые во втором томе Кнута? Так уверяю вас - ваши построения их и вовсе не пройдут. Ибо сумма задана, а соответвенно поведение ваших членов не может быть полностью случайным.

А насчет случайного. Есть вот, например задача - случайным образом распределить числа от 1 до 1000000 в массиве с миллионом элементов.

Нормальный способ - он у того же Кнута описан. Но иногда, новички используют другие методы. Например, заполняют массив сначала его индексами, а потом бегут от начала до середины и меняют местами числа из первой части со случайными элементами из второй. Очевидно, что все идет насмарку. Кстати, также пойдет и на смарку, если бежать по четным и производить случайно замену с нечетными. И т.д и т.п. Случайность - это не так просто.

Хотя ради зачета, истиной можно и покривить. Зачет же. Именно по этому я не стал приводить правдоподобные примеры решения. Борис же такой грех на душу взял - сделал кому-то к зачету задачку. Теперь авор должен будет часть корочки от диплома принести МВо.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.005 c
2-1242878656
Виталий_______
2009-05-21 08:04
2009.07.12
Освобождение памяти TList


15-1242057717
Rouse_
2009-05-11 20:01
2009.07.12
Ну воть, собственно о чем и говорилась фомам неверующим


2-1242992535
LSDxLove
2009-05-22 15:42
2009.07.12
программа чтения характеристик и просмотра графических bmp файлов


15-1241819732
Johnnnn
2009-05-09 01:55
2009.07.12
Windows XP Taskbar?


15-1241797779
Копир
2009-05-08 19:49
2009.07.12
А вот, история! Это Вам не Карамзин. Какой-то Анисимов?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский