|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
массив сл чисел , с заданной суммой элементов
Помогите, пожалуйста! Нужно создать одномерный массив, 20 значений, заполненный случайнымми числами, с выполнением условия, чтоб сумма элементов была равна 1200. массив не может содержать нули, значения могут повторяться. Как создать массив и заполнить я знаю, подскажите хотя бы алгоритм
|
#2
|
|||
|
|||
Генерируешь 19 чисел случайным образом, а 20-е высчитываешь как 1200 - сумма первых 19-ти. Все. При вычислении 20-го проверяешь, что если оно равно 0, то, соответсвенно, отнимаешь 1 от 19-го и 20-е ставишь в 1.
Сама генерация - с помощью функции Random^ A[i] := Random(100) + 1; // +1 - что бы гарантированно <> 0. |
#3
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
причем числа не могут быть отрицательными
|
#5
|
||||
|
||||
Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 03.04.2009 в 22:00. |
#6
|
|||
|
|||
Читай внимательно - 20 чисел! Итого 20 * 100 = 2000 > 1200!!!
|
#7
|
|||
|
|||
я сделал!!!!
a[1]:=random(1200-19)+1; //макс элемент, остальные могут быть только единицы sum:=a[1]; b:=(1200-19)+1-a[1]; for i:=2 to 19 do begin a[i]:=random(b)+1; b:=b+1-a[i]; sum:=sum+a[i]; end; a[20]:=1200-sum; |
#8
|
|||
|
|||
ребята, а подскажите еще, есть так называемая функция ошибок - erf, и обратная ей erfc, насколько я знаю функций вычисления интергралов в делфи нет, если представить интеграл, как конечную сумму, то для подинтегрального выражения>1 необходдимо очень большое число шагов, следовательно много времени для вычислений, это для меня не допустимо. помогите, как выполнить, точность вычислений должна быть до 3 знака после запятой
|
#9
|
|||
|
|||
забыл интеграл
|
#10
|
||||
|
||||
Цитата:
Вполне допустима ситуация когда будет сгенерирован ряд начинающийся с 1999,2 в итоге на втором элементе имеем переполнение. С чего появилась цифра 100 в вашем примере мне непонятно. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Цитата:
prasvit, функция ошибок разлагается в степенные ряды. На мой взгляд, это неплохая альтернатива интегрированию, когда требуется заданный уровень точности вычислений. Читайте Википедию. |
#12
|
||||
|
||||
78
2 68 75 115 52 13 87 72 93 11 70 79 5 47 93 19 24 107 Такой массив нужен? |
#13
|
|||
|
|||
ну массив вроде такой, только я уж сделал, спасибо большое
|
#14
|
||||
|
||||
Привет, вот надыбал фаш форум, и решил полазить!
ребята, а зачем заморачиватся?! давайте зделаем так: Код:
repeat for i:=1 to 20 do a[i]:=random(100); for i:=1 to 20 do sum:=sum+a[i]; if sum=1200 then log:=0 else if sum<>1200 then log:=1; until log<>0; lmikle: Пользуемся тегами!!! вот как то так, но оно не совсем работает))) попробуйте, может кто-то доработает)))))) |
#15
|
|||
|
|||
Цитата:
Абсолютно не оптимально. Твой алгоритм будет крутиться покуда не сгенерит ряд, сумма элементов которого точно равна 1200. а это может занять много времени. Да и внутренние циклы можно оптимизировать. Как уже говорил, тут надо делать адаптивние решение. Пример моего варианта: Код:
var A : Array [1..20] Of Integer; procedure InitArray; var I : Integer; S : Integer; begin S := 0; For I := 1 To 19 Do Begin A[i] := Random(100)+1; S := S + A[i]; End; If S < 1200 - 1 Then A[20] := 1200 - S Else InitArray; end; Здесь тоже есть вероятность "зацикливания", однако она минимальна, т.к. вероятность того, что сумма 19ти случайных значений от 1 до 100 будет больше 1200 достаточно невысока. Если учесть, что встроеный генератор имеет нормальное распределение (а не равномерное, как полагают многие), то вероятность второго захода генерации я рассматриваю как величину бесконечно малую, а уж если такое случится, то третий заход практически невероятен. |