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!
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...
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 ...
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;
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....... :/
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.
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)...
--> 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.
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
Synes godt om
Slettet bruger
14. juli 2002 - 15:20#23
Lukketid ..
Synes godt om
Ny brugerNybegynder
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.