Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2012, 23:33   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не, теперь вариант 2 в пролете
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2012, 23:44   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Тогда как быть?
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2012, 23:50   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Тогда как быть?
Мой второй вариант в пролете. А так код из поста 4, оптимизировать возможно где-то. На правильность не анализировал, но общая идея примерно в том напралении
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.10.2012, 06:38   #14
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Иллюстрация моей идеи на Вашем коде. Плюсы: взятие рандомного элемента( именно равномерно среди всех, хотя Ваш вариант особо не проверял на данный параметр, но из-за магии for i2 := 0 to (Count - 1 - i) do iRand := iRand - Items[i2].Images.BuffCount; в которую не захотел вникать, почему-то думаю, что может некоторые массивы будут получать менее/более вероятное попадание в них). Второй плюс - возможность реюза сохранённого массива.
Код:
var
  i, i2, k, BuffMax: Integer;
  iRand: Int64; // зачем ? всё равно ведь буфмакс интерджер
  tmpar: array of tpoint;
begin
  for i := 0 to Count - 1 do
    BuffMax := BuffMax + Items[i].Images.BuffCount;
  // Общая длинна всех массивов
  setlength(tmpar, buffmax); // задаем тут , чтобы не переаллоцировать
  Randomize; // выкинуть в formcreate какой-нибудь
  iRand := RandomRange(0, BuffMax); // Случайный номер
  k := 0;
  for i := 0 to Count - 1 do
  for i2 := 0 to Items[i].Images.BuffCount -1 do
  begin
    tmpar[k] := Point(i, i2);
    inc(k);
  end;

  Result := Items[tmpar[irand].x].Images.Buff[tmpar[irand].y];
end;
Собственно говоря, все идеи, озвученные в теме (и Ваш код из #4), так или иначе несут один принцип - взятие рандомного числа среди всех и выбор нужной записи. Потому я и спрашивал, надо ли собирать(ну , то есть, и хранить в последствии), или же только выбрать 1 элемент. Собственно, хочу обратить внимание, что если задача взятия рандомного элемента стоит часто, а массивы относительно стабильны и редко меняются - то надо лишь переписать мой код для хранения tmpar. При изменениях оригинальных массивов, можно подшаманивать tmpar, для чего я бы как раз и задействовал properties из ООП )) Но а вообще я бы обернул это дело в ступенчатый 2мерный массив ( не прямоугольный) и работал бы с ним через методы класса, в том числе автоматом получая обновления из ориг. массивов и предоставляя метод для взятия рандом элемента. Почему ступенчатый - чтобы меньше сетленсов делать, точнее только 1 на 1 изменённый ориг. массив, ибо ступенчатые - массив в массиве , каждый со своей длиной, и будут отражать всю картину по ориг. массивам.

Последний раз редактировалось phomm; 24.10.2012 в 06:42.
phomm вне форума Ответить с цитированием
Старый 24.10.2012, 08:26   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть одномерные массивы в количестве N, и разных размеров X.
Необходимо их собрать в 1 массив, и оттуда взять случайный элемент.
Вотъ. Я был прав. Потому и предложил не собирать кучки в одну песочницу, а делать карты расположения этих кучек. У массива есть начало, можно хранить в карте адрес на начало каждого массива и его длину. Тогда не составит труда рассчитать адрес на любой элемент любого из массивов по номеру по порядку согласно всем массивам. Это такой же принцип как и индексация БД. Ниче никуда не нужно переносить тратя память и ресурсы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вставить диапазоны ячеек из разных файлов в один, но так чтобы они шли один ниже другого? Squarded Microsoft Office Excel 4 24.07.2011 19:24
Множество, содержащее натуральные числа из первой сотни. Сформировать новое множество из простых чисел первого множества Aimet Паскаль, Turbo Pascal, PascalABC.NET 3 16.06.2011 20:50
Дано множество А, напечатать четные элементы, входящие в другое множество (Паскаль) Марийка92 Помощь студентам 4 03.04.2011 17:38
Задано некоторое множество М и множество Т того же типа dark999 Помощь студентам 5 01.04.2011 14:17
обьединить массивы в один diliana PHP 5 16.07.2010 13:55