Форум: "Основная";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизСоздание генератора случайных билетов. Найти похожие ветки
← →
kyn66 © (2005-12-29 16:34) [0]Уважаемые мастера. Мною (не без Вашей помощи) была написана программа для проверки лотерейных билетов "Суперлото" и "Ваше лото". Кого интересует - может заценить http://yurec66.narod.ru . Сейчас у меня возникла идея для сохдания генератора случайных билетов, чтобы проверить программу на большом количестве билетов, т.к. набирать
вручную влом. Едея следующая:
1) Создаем массив из тридцати чисел в диапазоне 1-:-90 спасибо Verg;
2) Согласно определенным правилам, расставляем полученные числа в StringGrid
(так надо, поверьте)
3)Самое главное !!! числа должны расставляться каждая в свою ячейку
согласно описаному ниже правилу
Var
A : array[1..30] of integer; // <--{полученный массив}
begin
...
i := 1;
for k := 0 to 5 do
for m := 0 to 4 do
begin
case (A[i]) of
1..9 : n := 0;
10..19 : n := 1;
20..29 : n := 2;
30..39 : n := 3;
40..49 : n := 4;
50..59 : n := 5;
60..69 : n := 6;
70..79 : n := 7;
80..90 : n := 8;
end; {Case}
StringGrid1.Cells[n, k] := IntToStr(A[i]);
Inc(i);
end;
...
end;
Проблема заключается в следующем. Как Вы видите, числа из массива выбираются по 5,
т.к. в билете 6 строк по 9 столбцов в каждой а цифр в строке может быть только 5.
И вот, вставляя числа из массива, может выпасть так, что число 5 и 3 могут быть в
одной пятерке, а так не должно быть, в противном случае число 3 (если идет после 5
в пятерке - займет ее позицию). Долго не мог понять, почему в некоторых строках у
меня не по 5 чисел. А дело именно в этом.
Подскажите, как придумать правильный алгоритм распределения чисел по ячейкам ???
Это наверное что-то получается случайный массив в случайном массиве?
Спасибо.
← →
Zeqfreed © (2005-12-29 19:28) [1]kyn66 © (29.12.05 16:34)
type
TLotteryTicketArray = array[0..8, 0..5] of Integer;
...
procedure GenerateLotteryTicket(out lta : TLotteryTicketArray);
var
i, j, k : Integer;
genarr : array[0..89] of Boolean;
randarr : array[0..29] of Byte;
begin
for i := 0 to 8 do
for j := 0 to 5 do begin
lta[i, j] := 0;
end;
Randomize();
for j := 0 to 5 do
for k := 0 to 3 do begin
repeat
i := Random(9);
until (lta[i, j] <> -1);
lta[i, j] := -1;
end;
for i := 0 to 89 do
genarr[i] := false;
for j := 0 to 5 do
for i := 0 to 8 do begin
if lta[i, j] <> -1 then begin
repeat
k := RandomRange(i * 10, i * 10 + 10);
until (not genarr[k]);
genarr[k] := true;
lta[i, j] := k;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lta : TLotteryTicketArray;
i, j : Integer;
begin
for i := 0 to 8 do
for j := 0 to 5 do
StringGrid1.Cells[i, j] := "";
GenerateLotteryTicket(lta);
for i := 0 to 8 do
for j := 0 to 5 do begin
if lta[i, j] <> -1 then
StringGrid1.Cells[i, j] := IntToStr(lta[i, j]);
end;
end;
Разбирайся :)
← →
Zeqfreed © (2005-12-29 19:35) [2]Zeqfreed © (29.12.05 19:28) [1]
type
TLotteryTicketArray = array[0..8, 0..5] of Integer;
...
procedure GenerateLotteryTicket(out lta : TLotteryTicketArray);
var
i, j, k : Integer;
genarr : array[0..90] of Boolean;
randarr : array[0..29] of Byte;
begin
for i := 0 to 8 do
for j := 0 to 5 do begin
lta[i, j] := 0;
end;
Randomize();
for j := 0 to 5 do
for k := 0 to 3 do begin
repeat
i := Random(9);
until (lta[i, j] <> -1);
lta[i, j] := -1;
end;
for i := 1 to 89 do
genarr[i] := false;
genarr[0] := true;
genarr[90] := true;
for j := 0 to 5 do
for i := 0 to 8 do begin
if lta[i, j] <> -1 then begin
repeat
k := RandomRange(i * 10, i * 10 + 10);
until (not genarr[k]);
genarr[k] := true;
lta[i, j] := k;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lta : TLotteryTicketArray;
i, j : Integer;
begin
for i := 0 to 8 do
for j := 0 to 5 do
StringGrid1.Cells[i, j] := "";
GenerateLotteryTicket(lta);
for i := 0 to 8 do
for j := 0 to 5 do begin
if lta[i, j] <> -1 then
StringGrid1.Cells[i, j] := IntToStr(lta[i, j]);
end;
end;
Как обычно, отослал не проверив достаточно хорошо. Приходится исправлять :)
Так же к коду прилагается небольшая оговорка: данный алгоритм иногда создает массив с полностью пустым столбцом. Насколько я знаю, в реальных билетах такого не бывает. Так что есть к чему стремиться ;)
← →
kyn66 © (2005-12-30 10:21) [3]Нуксь, посмотрим...
← →
evvcom © (2005-12-30 10:46) [4]
> case (A[i]) of
> 1..9 : n := 0;
> 10..19 : n := 1;
> 20..29 : n := 2;
> 30..39 : n := 3;
> 40..49 : n := 4;
> 50..59 : n := 5;
> 60..69 : n := 6;
> 70..79 : n := 7;
> 80..90 : n := 8;
> end; {Case}n := A[i] div 10;
if n = 9 then
Dec(n);
← →
kyn66 © (2005-12-30 11:14) [5]>> evvcom
Спасибо 8-)
>>Zeqfreed
Ну что я хочу сказать... Класс, в принципе все работает, однако я так и не увидел, чтобы появилось число 90 8-(. Что-то с кодом?
Если коллега не возражает, я впишу Ваше имя в About своей программы, как мастера, помогавшего в разработке программы 8-). А ?
← →
Zeqfreed © (2005-12-30 11:22) [6]kyn66 © (30.12.05 11:14) [5]
> я так и не увидел, чтобы появилось число 90
Я просто почему-то думал, что число 90 не является допустимым. Чтобы оно тоже появлялось достаточно убрать строкуgenarr[90] := true;
и цикл от 1 до 89 заменить на цикл от 1 до 90.
> Если коллега не возражает, я впишу Ваше имя в About
> своей программы, как мастера, помогавшего в разработке
> программы 8-). А ?
Ну, до мастера мне ещё далеко ;)
Но, если уж хочется вписать, то я, в общем-то, не против :)
← →
kyn66 © (2005-12-30 11:56) [7]>> Zeqfreed © (30.12.05 11:22) [6]
Я в принцИпе так и думал, вот тока про чтобы убрать вааще genarr[90] := true; не подумал
ЗЫ: Для вписания координат мне нужны данные(Имя, Фамилия), в данных я увидел тока Максим. Можно прислать мне на мыло(см. на моем сайтике с программой) 8-)
← →
kyn66 © (2005-12-30 12:45) [8]>> Zeqfreed
Выполнил все указания - всеравно не появляется 90 8-((( может здесь чего надо изменить?
var
i, j, k : Integer;
genarr : array[0..90] of Boolean;
randarr : array[0..29] of Byte;
← →
Zeqfreed © (2005-12-30 13:30) [9]kyn66 © (30.12.05 12:45) [8]
Да, видимо в справке имеется в виду не то, что написано и RandomRange генерирует числа включая только нижнюю границу диапазона (исходный код говорит об этом же). Тогда ко всем предыдущим исправлениям нужно добавить это:
k := RandomRange(i * 10, i * 10 + 10);
поменять на
if i < 8 then
k := RandomRange(i * 10, i * 10 + 10)
else
k := RandomRange(80, 91);
← →
kyn66 © (2005-12-30 14:48) [10]>> Zeqfreed
8-))) Пока достучался , чтобы сообщить , что сам нашел решение...
я сделал так:
repeat
if i = 8 then
k := RandomRange(i * 10, i * 10 + 11)
else
k := RandomRange(i * 10, i * 10 + 10);
PS:
Как насчет ФИО? Внесу в свою программу. Я кстати, отсылал мыло. Если получали - пришлите ответно.
← →
Zeqfreed © (2005-12-30 15:21) [11]kyn66 © (30.12.05 14:48) [10]
То, что сами нашли решение – очень хорошо, значит код более-менее понятный :) Там, кстати, объявление randarr лишнее, можно смело удалять ;)
> Как насчет ФИО? Внесу в свою программу. Я кстати,
> отсылал мыло. Если получали - пришлите ответно.
Не знаю, не люблю я слишком светиться ;) Если без фамилии никак, то лучше не надо, тем более, она никому ничего не скажет :) Я бы предпочел ник, если уж на то пошло.
← →
kyn66 © (2005-12-30 17:02) [12]>> Zeqfreed
Там, кстати, объявление randarr лишнее, можно смело удалять
И это нашел и убрал тоже сам 8-)
А ник тоже подойдет. Спасибо за помощь !
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.017 c