以下の様な、ボタンを押すとEdit1にランダムに文字が展開されるプログラムを作ってみました。
内容は、0-9、a-z、A-Zの文字例を使い、5〜10文字のランダムな文字例を生成する、言ったものです。
しかし、ボタンを何度か押してみると2文字や0文字、11文字等と言った文字数の文字例が作成されてしまう事があります。
原因と、対処法を教えて下さい。
function RandomStr(key: String): String;
var
i: Integer;
begin
Randomize;
for i := 0 to Random(6)+5 do Result := Result+key[Random(Length(key))];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=RandomStr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
end;
function RandomStr(key: String): String;
var
i: Integer;
begin
Randomize;
result := '';
for i := 0 to Random(6)+5 do
Result := Result+key[Random(Length(key))+1];
end;
ですね。result の初期化、および文字列のゼロ番目にアクセスしないように +1
をする必要があります。
また、Randomize は FormCreate などで1回だけ実行する方がベターです。
それから、標準関数のバグを気軽に口にしないようにしてください。プログラマは
そういうことに非常に敏感です。
> 5〜10文字のランダムな文字例を生成する
for i := 0 to Random(6)+5 do
これだと最大 for i := 0 to 10 do になりますから11文字になります。
for i := 0 to Random(5)+5 do
または
for i := 1 to Random(6)+5 do
が正しいです。
なんどもすみません。
> 5〜10文字のランダムな文字例を生成する
for i := 0 to Random(5)+5 do
では、最大で for i := 0 to 9 do、最低で for i := 0 to 5 do で6文字ですから
for i := 1 to Random(6)+5 do または for i := 0 to Random(6)+4 do
が正しいですね。
迅速な対応かつ適切な説明ありがとうございます。
正しい処理が出来ました。
>標準関数のバグ〜
そうですね。非常に申し訳ありませんでした。気をつけます。
ツイート | ![]() |