Random関数のバグ?

解決


Mark.X  2005-08-18 09:13:04  No: 17111

以下の様な、ボタンを押すと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;


anone  2005-08-18 10:35:16  No: 17112

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回だけ実行する方がベターです。

それから、標準関数のバグを気軽に口にしないようにしてください。プログラマは
そういうことに非常に敏感です。


anone  2005-08-18 10:40:34  No: 17113

> 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

が正しいです。


anone  2005-08-18 10:49:17  No: 17114

なんどもすみません。

> 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

が正しいですね。


Mark.X  2005-08-18 11:19:52  No: 17115

迅速な対応かつ適切な説明ありがとうございます。
正しい処理が出来ました。

>標準関数のバグ〜
そうですね。非常に申し訳ありませんでした。気をつけます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加