Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как организовать нормальный "рандом"?? [D7, WinXP]


Страницы:   1 2

VlaDD ©   (2004-09-30 02:58:00) 

Суть задачи такова:
На экране 8 ячеек, в каждой из них записано какое-то первоначальное значение(1..10). Нужно организовать "рандом", чтобы в случайно выбранной ячейке число наращивалось на 1. За один такт только одна ячейка. При достижении числа 10 в какой-либо ячейке, она выпадает из "рандома", а последующие такты ее не косаются. Так продолжается, пока все числа в ячейках не дойдут до 10. Обязательное условие- чтобы небыло холостых ходов, т.е. "рандом" должен выбирать только из имеющихся ячеек куда прибавить еденичку.
Вроде задача простая, суть понятна, понимаю как делать, но воплотить в жизнь не получается!!! Помогите плиззз!!! Хотя бы на словах, но конечное же лучше алгоритм


Defunct   (2004-09-30 04:20:00) [21]

default ©   (30.09.04 04:05) [9]
[8] - пример удаления без явного удаления, просто помечаем какие ячейки удалены. текущая(удаляемая) ячейка - и есть та, которую надо увеличивать до 10 или уменьшать до 0 в общем, делать с ней все что надо.

default ©   (30.09.04 04:08) [10]
я же промолчал про [5], хотя он мне тоже показался ерундой и жульничеством с первого взгляда.


default   (2004-09-30 04:18:00) [22]

var
Mas: Array[0..7] of Byte;
CountDelete: Byte;
IncIndex: Byte;
begin
...
CountDelete := 0;
Randomize;
repeat
  IncIndex := Random(8-CountDelete);
  Inc(Mas[IncIndex]);
  if Mas[IncIndex] = 10 then begin
    Mas[IncIndex] := Mas[7-CountDelete);
    Inc(CountDelete);
  end;
until CountDelete = 8;

вот что предлагал в [7]


default   (2004-09-30 04:08:00) [23]

да и вообще ерунда какая-то(не в обиду)


default   (2004-09-30 04:05:00) [24]

Defunct ©   (30.09.04 03:59) [8]
это не то, это жульничество
кстати смысл массива A в Вашем случае вообще не понятен, вообще совсем не то и с границами напутали...


Defunct   (2004-09-30 03:59:00) [25]


A: Array[1..10] of boolean; // ячейки
deleted : integer;
index   : integer;

begin
 for i:=1 to 10 do A[i] := True; // все ячейки есть
 deleted := 0;                   // 0 ячеек удалено
 
 for i:=1 to 10 do
 begin
   index := random( 10 - deleted);
   while Not(A[index]) do
   begin
      inc(index);
      if index>10 then index := 1;
   end;
   
   A[index] := False;      // удалить ячейку.
   deleted := deleted + 1; // увеличить число удаленных ячеек
 end;
 
end;


default   (2004-09-30 03:55:00) [26]

ты всё правильно понял
а Вы какую щас тему проходите на занятиях?
можно например при достижении 10 в какой-то ячейки закинуть в эту ячейку значение из последней и делать Random(7)
когда появится следующая десятка кидать в эту ячейку значение из предпоследней ячейки и делать Random(6) и тд
холостых не будет, НО тут мы вмешиваемся в равномерное распределение чисел в заданном интервале которое даёт Random


VlaDD   (2004-09-30 03:45:00) [27]

...
  repeat
    IncIndex := Random(8);
  until not (IncIndex in DeathSet);
  ...
На сколько я понимаю, здесь цикл вхолостую будет крутиться, пока не найдет нужное число (к примеру ячеек 100, 99 из них уже заполнены и включены во множество). Мне ни в коем случае так нельзя...


default   (2004-09-30 03:32:00) [28]

var
 Mas: Array[0..7] of Byte;
 DeathSet: Set of Byte;
 IncIndex: Byte;
begin
 ...
 DeathSet := [];
 Randomize;
 repeat
   repeat
     IncIndex := Random(8);
   until not (IncIndex in DeathSet);
   Inc(Mas[IncIndex]);
   if Mas[IncIndex] = 10 then Include(DeathSet, IncIndex)
 until DeathSet = [0,1,2,3,4,5,6,7]
 ...


VlaDD   (2004-09-30 03:26:00) [29]

Я использовал списки, но при удалении из него любого элемента (достигшего 10) не могу отследить его новое местоположение.
К примеру:
12345678   //изначально (Random(9))
1245678    //третья ячейка достигла 10 (Random(8))
124678     //пятая ячейка достигла 10 (Random(7))
В результате, к примеру, шестая ячейка в списке находится на четвертом месте.

Может подскажите радикально иной способ


default   (2004-09-30 03:19:00) [30]

множества используй


VlaDD   (2004-09-30 03:17:00) [31]

Завтра меня подвесят за "одно" место. Вот и сижу уже полночи - ДУМАЮ!!! Ну хотябы на словах...


default   (2004-09-30 03:10:00) [32]

думай


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо