Avatar billede michael-schou Novice
20. oktober 2001 - 17:38 Der 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!!!
Avatar billede ziron Nybegynder
20. oktober 2001 - 18:53 #1
hmm da var da noget lidt størrer :-)

/ZIRON
Avatar billede delphi Nybegynder
20. oktober 2001 - 19:31 #2
Prøv det her:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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;

end.
Avatar billede ziron Nybegynder
20. oktober 2001 - 19:43 #3
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....

/ZIRON
Avatar billede zerohero Nybegynder
20. oktober 2001 - 19:45 #4
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 := \'\';
Avatar billede nca Juniormester
20. oktober 2001 - 19:45 #5
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;
Avatar billede zerohero Nybegynder
20. oktober 2001 - 19:47 #6
Jamen skal man ikke bare tilføje:
Randomize også derefter Random()???
Avatar billede nca Juniormester
20. oktober 2001 - 19:47 #7
Bare slet variablen Letter
Avatar billede ziron Nybegynder
20. oktober 2001 - 19:51 #8
nca >> din linie:

Res:=Res+Copy(Letters,y,1);

vil være lidt pænere sådan her ik???

Res:=Res+Letters[y];

/ZIRON
Avatar billede zardic Nybegynder
20. oktober 2001 - 21:20 #9
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;

Zardic
Avatar billede zardic Nybegynder
20. oktober 2001 - 21:23 #10
Og hvis do kun vil have 18 af de 29 så skal
J := 18

Zardic
Avatar billede delphi Nybegynder
21. oktober 2001 - 00:35 #11
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 := \'\';

Det er altid pænt at initialisere sine variable. 

Peter
Avatar billede yeti Nybegynder
21. oktober 2001 - 20:50 #12
Det er fordi i glemmer at rande Randomize () Kig etv i hjælpen

Jens B
Avatar billede hreiff Nybegynder
26. oktober 2001 - 13:57 #13
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)

//hreiff
Avatar billede hreiff Nybegynder
26. oktober 2001 - 14:30 #14
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)
Avatar billede delphi Nybegynder
06. november 2001 - 10:43 #15
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
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