20. oktober 2001 - 17:38Der er
14 kommentarer og 1 løsning
Random Af 18 Bogstaver
Hvordan kan jeg lave random med 18 forskellige bogstaver? Bogstaverne må ikke være de samme, hvert enkelt bogstav skal være i et edit felt og så skal bogstaverne udtages fra alfabetet med Æ,Ø & Å selvfølgelig!!!
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } Function GetRandomStr : String; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.GetRandomStr : String; Const Alfabet = \'ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ\'; Var PickStr : String; RanVal : Integer; t : Integer; begin PickStr := Alfabet; Result := \'\';
For t := 1 To 18 Do Begin RanVal := Random(Length(PickStr)) + 1; Result := Result + PickStr[RanVal]; Delete(PickStr, RanVal, 1); End; end;
procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text := GetRandomStr; end;
delphi >> hmmm det ser jo godt ud :-) men prøve at start programmet og se hvilke bogstaver du får og luk og start igen, og gør det et par gange, får du ikke de samme hele tiden. hmmm det er endelig lidt sjovt, jeg troede at random, var en random funktion....
delphi>> IKKE NOGET VIGTIGT SOM SÅ :-p men hvorfor skriver du: Result := Result+PickStr[RanVal]; kunne du ikke bare nøjes med: Result := PickStr[RanVal]; og samtidig smide følgende linje ud: Result := \'\';
Prøv denne funktion Function GetLetters:String; var x,y: Integer; Letters, Res: String; Letter: Char; begin Randomize; Letters:=\'\'; For x:=1 to 26 do letters:=Letters+Chr(64+x); Letters:=Letters+\'ÆØÅ\'; For x:=1 to 18 do begin y:=random(length(letters))+1; Res:=Res+Copy(Letters,y,1); Delete(Letters,y,1); end; Result:=Res; end;
Function GetRandomString():string; Var Temp,Alfabet:string; J,I:integer; Begin Alfabet := \'ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ\'; Randomize; J := 29; // Dette Skal være det samme som altal i Alfabet While (J > 0) do Begin I := random(J) +1; Temp := Temp + Alfabet[I]; Delete(Alfabet,I,1); Dec(J); End; Result := Temp; End;
Ziron> Jeg havde lige glemt i forbifarten af seed\'e randomgeneratoren. Dette skal gøres en gang, typisk i din main forms OnCreate event eller evt. i en Initialization blok.
Zeror Hero> Som der står i mit svar til Ziron, skal Randomize kun kaldes en gang. Det fremgår lidt af dit svar at du enten vil medbringe kaldet i løkken eller evt. i starten af GenRandomStr rutinen. Dette vil ikke være den \'korekte\' måde at gøre det på (om end det heller ikke er en katastrofal fejl at gøre det). Desuden skriver du:
>men hvorfor skriver du: >Result := Result+PickStr[RanVal]; >kunne du ikke bare nøjes med: >Result := PickStr[RanVal];
Nix, jeg opbygger en streng, dvs. adderer, en char ad gangen ind til den er 18 chars lang. Gør jeg som du foreslår vil de første 17 \'resultater\' ikke komme med i det endelige resultat.
>og samtidig smide følgende linje ud: >Result := \'\';
Zardic\'s funktion er tæt på, men man skal lige huske at nulstille temp. Og det er en god idé at bruge length(alfabet) i stedet for 29 (så undgår man fejl, og man kan undlade ÆØÅ eller tilføje 12345 uden problemer). Derfor:
Function GetRandomString:string; {returnerer en tilfældig alfabetstreng} Var Temp,Alfabet:string; J,I:integer; Begin Randomize; Alfabet := \'ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ\'; J := length(Alfabet); Temp := \'\'; While (J > 0) do Begin I := random(J)+1; Temp := Temp + Alfabet[I]; Delete(Alfabet,I,1); Dec(J); End; Result := Temp; End;
Kaldes med: strn:= GetRandomString; og de 18 bogstaver kan tages som de 18 første, dvs. Edit1.Text:=Strn[1]; Edit2.Text:=Strn[2]; ... Edit18.Text:=Strn[18];
evt kan man lave en løkke: for i := 1 to 18 do Components[i] := strn[i] (forudsat at de 18 editboxe er komponent nr. 1 til 18)
Components kræver nok lidt mere forklaring, så her er en færdig procedure:
procedure IndsaetText(strn:string); {fordeler strn i tilgængelige EditBox\'e} var i,j: integer; begin j:= 0; for i:= 0 to componentcount-1 do if components[i] is TEdit then begin inc(j); TEdit(Components[i]).Text := strn[j]; end; end;
Kaldes med: IndsaetText(GetRandomString);
Fordeler de tilfældige bogstaver i de EditBox\'e der er på formen. (dvs. hvis der er 18 Editbox\'e får man 18 tilfældige forskellige bogstaver i dem)
Michael: Hvorfor afviser du mit svar? Det var først og det gør det du ber om. hreiff svar, som kom en uge efter mit, gør i bund og grund det samme som mit - opbygger en streng et tegn ad gangen, men det giver du de fulde point.
Der er noget der halter her...
Peter
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.