Avatar billede flozzy Nybegynder
06. maj 2001 - 11:18 Der er 6 kommentarer og
1 løsning

For-lykke for hurtig...

Jeg skal bruge en string af tilfældige karakterer. Til det brug bruges en funktion med en for-lykke:

for i:=1 to Length(S) do
begin
  S[i]:=Char(Random(256));
end;
Result:=S;

Der returneres nu en string af ens karakterer i stedet for \"random\" karakterer.
Hvis jeg lægger en forsinkelse på 50 milisekunder ind i hvert gennemløb, virker det fint! Hvilket alternativ kan bruges?...og hvorfor kan Random() ikke følge med???

Mvh. JJ Engelsted / jje@post3.tele.dk
Avatar billede speedy Nybegynder
06. maj 2001 - 11:32 #1
Jeg ved ikke om dette er grunden, men prøv at køre funktionen randomize inden løkken, eller onFormCreate

/SpEeDy
Avatar billede snowball Novice
06. maj 2001 - 11:38 #2
Denne funktion virker fint:

function RandomStr (ALen : integer) : string;
// ALen - desired length of password
const Tbl : array [0 .. $1F] of char = (
  \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'A\', \'B\',
  \'C\', \'D\', \'E\', \'F\', \'G\', \'H\', \'K\', \'M\', \'N\', \'P\', \'Q\', \'R\',
  \'S\', \'T\', \'U\', \'V\', \'W\', \'X\', \'Y\', \'Z\');
var i, n, k, x, j : integer;
begin
  SetString (Result, nil, ALen);
  n := ALen * 5; // bits in random number
  j := 1;
  while n > 0 do begin
    if n > 30 then k := 30 // work with 32-bits numbers
    else k := n;
    x := Random (1 shl k - 1);
    for i := 1 to k div 5 do begin
      Result [j] := Tbl [x and $1F];
      inc (j);
      x := x ShR 5;
    end;
    dec (n, k)
  end;
end;

Du kalder den så bare med

MyString := RandomStr(x)

x = hvor mange tegn strengen skal være på!

Snowball
Avatar billede erikjacobsen Ekspert
06. maj 2001 - 12:31 #3
Hmm, med den indbyggede Random giver det da ikke ens bogstaver i
spørgerens eksempel. Må vi se hele din kode?
Avatar billede flozzy Nybegynder
07. maj 2001 - 05:07 #4
Ja, koden ser sådan ud:

function TForm1.MixString: String;
var S:String;
    i:Integer;
begin
    SetLength(S,12);
    for i:=1 to Length(S) do
    begin
      S[i]:=Chr(MyRandom(156,45));
    end;
    Result:=S;
end;

function MyRandom(Max :Integer;Min:Integer = 1): Integer;
var Int:Integer;
begin
    Randomize;
    Int:=Random(Max + 1);
    if Int >= Min then
      Result:=Int
    else
      Result:=Int+Min;
end;
Avatar billede borrisholt Novice
07. maj 2001 - 07:58 #5
flozzy >>

Randomize må du kun kkalde een gang. Ikke n gange som du gør.


Fra onæine hjælpen :

Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.


Prøv der her det virker :

function MyRandom(Max :Integer;Min:Integer = 1): Integer;
var
  Int : Integer;
begin
  Int:=Random(Max + 1);
  if Int >= Min then
    Result:=Int
  else
    Result:=Int+Min;
end;


function TForm1.MixString: String;
var
    S : String;
    i : Integer;
begin
  SetLength(S,12);
  for i:=1 to Length(S) do
    S[i]:=Chr(MyRandom(156,45));
  Result:=S;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := MixString;
end;

initialization
  Randomize;
end.


Jens B. http://fotx.net/borrisholt
Avatar billede erikjacobsen Ekspert
07. maj 2001 - 14:59 #6
Altså, flozzy, hvorfor spilder du vores tid med at stille et spørgsmål,
der er helt hen i vejret i forhold til den kode du rent faktisk kører.
Prøv lige at tænk dig om en anden gang.
Avatar billede flozzy Nybegynder
08. maj 2001 - 02:20 #7
Sorry, men tak for alle svarene. Nu virker det bare! Forklaringen om Randomize løste også et tidligere problem, der har drillet en del.
Mvh. Flozzy
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