Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2009, 20:41
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию массив сл чисел , с заданной суммой элементов

Помогите, пожалуйста! Нужно создать одномерный массив, 20 значений, заполненный случайнымми числами, с выполнением условия, чтоб сумма элементов была равна 1200. массив не может содержать нули, значения могут повторяться. Как создать массив и заполнить я знаю, подскажите хотя бы алгоритм
Ответить с цитированием
  #2  
Старый 02.04.2009, 20:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Генерируешь 19 чисел случайным образом, а 20-е высчитываешь как 1200 - сумма первых 19-ти. Все. При вычислении 20-го проверяешь, что если оно равно 0, то, соответсвенно, отнимаешь 1 от 19-го и 20-е ставишь в 1.
Сама генерация - с помощью функции Random^

A[i] := Random(100) + 1; // +1 - что бы гарантированно <> 0.
Ответить с цитированием
  #3  
Старый 02.04.2009, 20:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от lmikle
Генерируешь 19 чисел случайным образом, а 20-е высчитываешь как 1200 - сумма первых 19-ти. Все. При вычислении 20-го проверяешь, что если оно равно 0, то, соответсвенно, отнимаешь 1 от 19-го и 20-е ставишь в 1.
Сама генерация - с помощью функции Random^

A[i] := Random(100) + 1; // +1 - что бы гарантированно <> 0.
А если сумма 1-х двух случайно сгенерированных чисел уже больше 1200 ?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 02.04.2009, 21:10
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию

причем числа не могут быть отрицательными
Ответить с цитированием
  #5  
Старый 02.04.2009, 21:15
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Страдалецъ
А если сумма 1-х двух случайно сгенерированных чисел уже больше 1200 ?
фигню сказал. как может (даже если сгенерировались максимальные значения) 100+100>1200?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.04.2009 в 22:00.
Ответить с цитированием
  #6  
Старый 02.04.2009, 21:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Читай внимательно - 20 чисел! Итого 20 * 100 = 2000 > 1200!!!
Ответить с цитированием
  #7  
Старый 02.04.2009, 21:47
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию

я сделал!!!!

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  
Старый 02.04.2009, 21:53
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию

ребята, а подскажите еще, есть так называемая функция ошибок - erf, и обратная ей erfc, насколько я знаю функций вычисления интергралов в делфи нет, если представить интеграл, как конечную сумму, то для подинтегрального выражения>1 необходдимо очень большое число шагов, следовательно много времени для вычислений, это для меня не допустимо. помогите, как выполнить, точность вычислений должна быть до 3 знака после запятой
Ответить с цитированием
  #9  
Старый 02.04.2009, 22:02
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию

забыл интеграл
Изображения
Тип файла: jpg Безымянный.jpg (2.6 Кбайт, 8 просмотров)
Ответить с цитированием
  #10  
Старый 02.04.2009, 22:32
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от popyurv
Страдалецъ
фигню сказал. как может (даже если сгенерировались максимальные значения) 100+100>1200?
Почему-же фигню. В условии задачи неограничивается диапазон генерируемых значений. Это может быть и дробное число и больше 2000.
Вполне допустима ситуация когда будет сгенерирован ряд начинающийся с 1999,2 в итоге на втором элементе имеем переполнение. С чего появилась цифра 100 в вашем примере мне непонятно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 02.04.2009, 23:41
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от prasvit
то для подинтегрального выражения>1 необходдимо очень большое число шагов
Насколько мне известно, подынтегральное выражение тут не может быть больше единицы (экспонента в отрицательной степени).
prasvit, функция ошибок разлагается в степенные ряды. На мой взгляд, это неплохая альтернатива интегрированию, когда требуется заданный уровень точности вычислений. Читайте Википедию.
Ответить с цитированием
  #12  
Старый 03.04.2009, 00:16
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

78
2
68
75
115
52
13
87
72
93
11
70
79
5
47
93
19
24
107

Такой массив нужен?
Ответить с цитированием
  #13  
Старый 03.04.2009, 00:31
prasvit prasvit вне форума
Прохожий
 
Регистрация: 04.02.2009
Сообщения: 13
Репутация: 10
По умолчанию

ну массив вроде такой, только я уж сделал, спасибо большое
Ответить с цитированием
  #14  
Старый 03.04.2009, 16:41
Аватар для joker7438
joker7438 joker7438 вне форума
Прохожий
 
Регистрация: 03.04.2009
Адрес: Одесса
Сообщения: 18
Репутация: 10
По умолчанию

Привет, вот надыбал фаш форум, и решил полазить!
ребята, а зачем заморачиватся?!
давайте зделаем так:

Код:
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  
Старый 03.04.2009, 17:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от joker7438
Привет, вот надыбал фаш форум, и решил полазить!
ребята, а зачем заморачиватся?!
давайте зделаем так:

<skip>

вот как то так, но оно не совсем работает))) попробуйте, может кто-то доработает))))))

Абсолютно не оптимально. Твой алгоритм будет крутиться покуда не сгенерит ряд, сумма элементов которого точно равна 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 достаточно невысока. Если учесть, что встроеный генератор имеет нормальное распределение (а не равномерное, как полагают многие), то вероятность второго захода генерации я рассматриваю как величину бесконечно малую, а уж если такое случится, то третий заход практически невероятен.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter