![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как организовать нормальный "рандом"?? [D7, WinXP]
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]думай