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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2024, 17:50   #1
tetris
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 24
По умолчанию Рандомное слайдшоу

Delphi
Есть N JPG картинок загруженных в Лист.
Запускаем режим слайдшоу. Выбираем по одной картинке.
Когда перебираем последовательно - все просто.
Как сделать рандомный выбор картинки без повторов.
Присваивать каждой картинке переменную? А если N=500...?
Может есть более хитрый способ исключить из результата "уже использованные"?
(Удалять "уже использованные" из листа не получится он чистится только весь)
tetris вне форума Ответить с цитированием
Старый 09.12.2024, 19:01   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,352
По умолчанию

Например:
A)
1. Получить кол-во картинок: N
2. Создать массив размера N и заполнить его по порядку: 1, 2, 3, ..., N
3. Перемешать массив: shuffle(). Необходимую библиотеку можно найти (возможно, что она уже есть, например, в Python, C++).
4. Последовательно просматриваем новый массив и воспроизводим картинку в соответствии с получаемым номером.

B)
Можно создать строковый массив с именами файлов, а потом его перемешать - shuffle().

C)
1. Можно перемешивать массив после каждого проигрывания всех картинок.
2. Перемешивать оставшуюся часть после проигрывания 5, 10 или некоторого другого кол-ва картинок.

PS: Не заметил про Delphi
Вот решение от Нейро:
Код:
program ShuffleArrayDemo;
{$APPTYPE CONSOLE}
uses SysUtils, Math;

procedure ShuffleArray(var A: array of Integer);
var i, j, temp: Integer;
begin
  Randomize;
  for i := High(A) downto Low(A) do
  begin
    j := Random(i + 1);
    temp := A[i];
    A[i] := A[j];
    A[j] := temp;
  end;
end;

var A: array of Integer; i: Integer;
begin
  SetLength(A, 10);
  for i := Low(A) to High(A) do A[i] := i;
  Writeln('Original array:');
  for i := Low(A) to High(A) do Write(A[i], ' ');
  Writeln;
  ShuffleArray(A);
  Writeln( 'Shuffled array:');
  for i := Low(A) to High(A) do Write(A[i], ' ');
  Writeln;
end.
Другой источник:
Код:
procedure FastPermuteArray(A: TDynIntegerArray);
  procedure Swap(n, m: integer);
  var
    tmp: integer;
  begin
    tmp := A[n];
    A[n] := A[m];
    A[m] := tmp;
  end;
var
  i: Integer;
begin
  for i := High(A) downto 1 do
    Swap(i, RandomRange(0, i));
end;
Как-то так, ...

Последний раз редактировалось ViktorR; 09.12.2024 в 19:07.
ViktorR вне форума Ответить с цитированием
Старый 09.12.2024, 19:35   #3
tetris
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 24
По умолчанию

Да, про RandomRange я уже читал тут, там все не так однозначно.
tetris вне форума Ответить с цитированием
Старый 09.12.2024, 22:53   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,352
По умолчанию

Цитата:
Да, про RandomRange я уже читал тут, там все не так однозначно.
А по конкретнее можно?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рандомное отображение картинок. Vlad1698 Общие вопросы Delphi 15 22.02.2014 21:12
jQuery слайдшоу paravoz JavaScript, Ajax 1 26.04.2011 19:31
Рандомное заполнение MaxiCool Помощь студентам 1 15.04.2011 18:04
Слайдшоу filin67 JavaScript, Ajax 0 27.03.2010 16:47
Слайдшоу Davl Мультимедиа в Delphi 6 02.12.2007 13:37