Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Создание генератора случайных билетов.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
3-1133932685
DelphiN!
2005-12-07 08:18
2006.02.05
Out of Memory error After Post in FB table


15-1137252416
McSimm
2006-01-14 18:26
2006.02.05
Обнаружено сканирование портов с адреса delphimaster.ru


15-1137548206
Фрэнд
2006-01-18 04:36
2006.02.05
Что в папке C: WINDOWS Recent ?


2-1137429166
Silver__Dragon
2006-01-16 19:32
2006.02.05
Отслеживание USB


3-1133857572
SeZuka
2005-12-06 11:26
2006.02.05
Поля типа Graphic