Avatar billede jekk Nybegynder
17. april 2002 - 12:00 Der er 23 kommentarer

Banko-plade generator

Hej ...
er der nogen af Jer, der har lavet en banko-plade-generator og som kan hjælpe med noget kode ?

jeg skal lave en tilfældigheds generator baseret på tallene 1 - 90, som skal fordele de 90 forskellige tal på 6 plader med hver 3 rækker á 5 tal...

det næste problem er så at opbygge pladerne, som sådan nogen normalt ser ud d.v.s. 3 rækker á 9 felter (5 tal og 4 tomme), men det kan vente ...
Avatar billede hermandsen Juniormester
17. april 2002 - 13:02 #1
Skal den kunne printes ud, eller er det nok bare at have billede af det på skærmen?
Avatar billede hermandsen Juniormester
17. april 2002 - 13:07 #2
Det er nemlig let nok hvis der bare skal tegnes på Canvas, men hvis du vil til at printe dem ud så det også blive en ordentlig kvalitet med vektor-grafik og hvad ved jeg, så kan jeg desværre ikke hjælpe dig!
Avatar billede jekk Nybegynder
17. april 2002 - 13:18 #3
i første omgang vil jeg basere det på, at jeg genererer record i en standard database, hvor hver record f.eks. indeholder de 6 pladers række med de genererede tilfældige tal fra 1 - 90.

senere må jeg løse visnings-/print-problemet.

altså mit første behov er tilfældigheds generator opgaven...
jeg skal iøvrigt efterfølgende danne 1000 ark med hver 6 plader, hvor rækkerne totalt på tværs af alle plader og ark, skal være så forskellige at max 3 rækker må være ens - MEN lad det lige vente...
Avatar billede borrisholt Novice
17. april 2002 - 13:36 #4
Jeg kigger lidt på det ...
Avatar billede hermandsen Juniormester
17. april 2002 - 13:54 #5
Lav en mængde fra 1..90 og kør noget random noget, hvor du tjekker om random-tallet er ligger i mængden...

Jeg er stadig ikke helt sikker på jeg ved hvad det er du vil, men tror dog ikke det er så svært...
Avatar billede jekk Nybegynder
17. april 2002 - 15:22 #6
når jeg rejser dette spørgsmål, så er det ikke fordi jeg ikke kan lave en random-kode, der finder forskellige tal i et lukket interval,
men fordi jeg erindrer fra nostalgiens historie (tilbage i mikrodatamaternes tidsalder med 16 Kb "ram" og Basic-sprog), at det kunne tage utroligt langt tid at finde de manglende tilfældige tal i hele rækken og at dette problem vil blive endnu større, når jeg senere skal checke for max forekomster af ens rækker (i de 1000 gange 6 plader á 3 rækker med 5 tilfældige tal).
jeg forestiller mig, at det vil kunne tage døgn eller mere... inden "kabalen" ville gå op.
derfor er det mere "trickset" jeg går efter med denne tilfældigheds generator ...
Avatar billede hermandsen Juniormester
17. april 2002 - 16:22 #7
Arh... :)
Nu er jeg mere med! ;)
Avatar billede hreiff Nybegynder
17. april 2002 - 16:49 #8
Her en funktion som returnerer 15 tal mellem 1 og 90 uden dubletter:
Det er en god idé at sortere dem - det kigger jeg på senere.
Hvis der er mere end 3 tal inden for samme 10'er skal de kasseres.
Jeg skal nok kigge på en måde at fordele dem på, så der kommer 5 tal i hver række og med rigtig 10'er placering.
Nå men her er funktionen:

Const
  AntalTal=15;
  MaxNo = 90;

  Type
  Arr = array[1..AntalTal] of byte;

Function GetRandom: arr;
{returnerer AntalTal tilfældige tal (ingen ens)}
{med værdier mellem 1 og MaxNo }
Var
  Temp,Alfabet:string;
  J,I:integer;
Begin
  Alfabet := '';
  for I := 1 to MaxNo do
    Alfabet := Alfabet+chr(I);  {opretter alle tal}
  Randomize;                    {(en konstant kan også bruges)} 
  J := MaxNo;
  Temp := '';
  While (J > 0) do {blander tal}
  Begin
    I := random(J)+1;
    Temp := Temp + Alfabet[I];
    Delete(Alfabet,I,1);
    Dec(J);
  End;
  For I := 1 to AntalTal do    {vælger ud (vælger de første 15)}
    Result[I] := ord(Temp[I]);
End;

//hreiff
Avatar billede jekk Nybegynder
17. april 2002 - 17:00 #9
hreiff >>
herligt med et kode eksempel !

faktisk skal jeg ha' genereret ALLE 90 tal i en tilfældig orden, som jeg så kan "klippe" stykker á 5 tal ordnet, som du skriver i 10'er gruppering...

jeg har ikke "nærlæst" om din kode kan ændres til at finde alle 90 tal ! ...
Avatar billede borrisholt Novice
17. april 2002 - 17:19 #10
Avatar billede borrisholt Novice
17. april 2002 - 17:19 #11
Min løsning kan opfylde ALLE tre krav .. Et nul betyder et blank felt !

Jens B
Avatar billede jekk Nybegynder
17. april 2002 - 18:27 #12
borrisholt >>
tak - nu har jeg fået et godt afsæt...
Avatar billede jekk Nybegynder
17. april 2002 - 18:28 #13
og nu forstår jeg bedre, hvorfor man snakker om hest ;0))
Avatar billede hermandsen Juniormester
17. april 2002 - 18:43 #14
Hvad er det egentlig med de heste?!?
Avatar billede jekk Nybegynder
17. april 2002 - 18:52 #15
det fremgår tydeligt af
http://borrisholt.com/eksperten/Banko.zip !
Avatar billede hermandsen Juniormester
17. april 2002 - 19:09 #16
Kald mig bare blind, men jeg ser altså kun ordet "Hest" fremgå efter programmets navn! Hvorfor snakker man så om Hest?!? Fordi Hest indgår i program navnet?!? Øhhhh....... :/
Avatar billede hreiff Nybegynder
17. april 2002 - 20:39 #17
Jo, du kan godt finde alle 90 tal - bare sæt antaltal = 90
Men ønsker du at samtlige tal indgår på en side á 6 plader, eller skal de være tilfældige.
Jeg lavede koden til en helt tilfældig plade som du kunne tage 6 gange.
For at sortere de 15 tal (til brug for rigtig placering på pladen)  kan du bruge quicksort:

type Iarr = array[1..AntalTal] of byte;

Procedure Quick(var item:Iarr; count:byte);

Procedure PartialSort(left,right:byte; var a: Iarr);
var
  i,j,k : byte;

Procedure Switch(Var a,b: byte);
var
  c:byte;
Begin
  c := a;
  a := b;
  b := c;
End;

Begin  {PartialSort}
  k := (a[left]+a[right]) div 2;
  i := left;
  j := right;
  Repeat
    While a[i] < k do
      inc(i);
    While k < a[j] do
      dec(j);
    if i<=j then
    begin
      switch(a[i],a[j]);
      inc(i);
      dec(j);
    end;
  until i > j;
  if left < j then
    PartialSort(left,j,a);
  if i < right then
    PartialSort(i,right,a)
end;  {PartialSort}

Begin {Quick}
  PartialSort(1,count,item);
End;  {Quick}


Kaldes med resultatet fra GetRandom
a := GetRandom;
Quick(a,AntalTal);

Så får du 15 tilfældige tal (forskellige) sorteret i rækkefølge, lige til at sætte ind.
Avatar billede jekk Nybegynder
17. april 2002 - 21:44 #18
hreiff >>>
jeg ønsker at ALLE 90 tal udtrækkes random OG placeres på 6 plader á 3 rækker á 5 tal - og dermed 6 x 15 = 90.
herudover ville det væres ønskeligt, at hver række's tal placeres kolonnevis, således at kolonne 1 indeholder enere tal, kolonne 2 indeholder 10'ere tal o.s.v. til kolonne 9 indeholder 80'erne PLUS gamle Ole (90)...

er det muligt ??
Avatar billede borrisholt Novice
18. april 2002 - 06:58 #19
så vidt jeg kan se .. Så opfylder min dims de tre krav du vil have opfyldt !?!?

Jens B
Avatar billede hreiff Nybegynder
18. april 2002 - 07:54 #20
--> Jens B / Jekk
Har du kontrol for at der ikke kan forekomme mere end 3 tal i samme 10'er række?
Har du sikret at 4 står over 7 hvis de forekommer på samme plade.

--> Jekk
Så vidt jeg husker, kan samme tal normalt godt forekomme mere end 1 gang på et ark (6 plader). Det kan det ikke hvis alle 90 tal skal være på et ark.
Avatar billede hreiff Nybegynder
18. april 2002 - 07:55 #21
Men ellers må borrisholts forslag jo siges at dække behovet.
Avatar billede borrisholt Novice
18. april 2002 - 07:57 #22
Jeg kender ikke reglerne .. Jeg løste blot de opstillede krev ..

Du kan også skrive proceduren om således st de kommer i de rigtige cols :

procedure TBankoCounters.GetBankoPlade(enPlade: TBankoplade);
var
  i,j,k,l  : Integer;
  Done : Boolean;
  BankoRow, BankoRowSorted : TBankoRow;
begin
for i := 1 to 3 do
begin
  ZeroMemory(@BankoRow, Sizeof(TBankoRow));
  for j := 1 to 5 do
  begin
    BankoRow[j] := FNummere[FTop];
    Dec(FTop);
  end;
  RandomizeArray(BankoRow);

  ZeroMemory(@BankoRowSorted, Sizeof(TBankoRow));

  for j := 1 to 9 do
  begin
    k := BankoRow[j];
    if k <> 0 then
    begin
      k := k div 10;
      while BankoRowSorted[k] <> 0 do
        inc(k);
      BankoRowSorted[k] := BankoRow[j]
    end;
  end;
  enPlade.FBankoNummere[i] := BankoRowSorted;
end;
end;


Jens B
Avatar billede Slettet bruger
14. juli 2002 - 15:20 #23
Lukketid ..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester