Board logo

Subject: MicroTip#1:随机生成某一范围的浮点数 [Print This Page]

Author: skyjacker    Time: 2007-2-9 10:39     Subject: MicroTip#1:随机生成某一范围的浮点数

// MicroTip#1:随机生成某一范围的浮点数
// Wrtten by SkyJacker
function RandomFloat(L, H: Single): Single;
begin
  repeat
    Result := Random * H;
  until (Result > L);
end;
Author: kendling    Time: 2007-2-9 10:45

这样应该会单、快捷一点吧?

function RandomFloat(L, H: Single): Single;
begin
  Result := Single((H - L + 1) * Random + L)
end;
Author: Passion    Time: 2007-2-9 11:08

也是。
第一个不能保证时间性。
第二个方便点,但边界条件不知道如何。
Author: skyjacker    Time: 2007-2-9 11:58

// 随机生成某一范围的浮点数
function RandomFloat(L, H: Single): Single;
begin
  repeat
    Result := Random * H;
  until (Result > L);
end;

function RandomFloatA(L, H: Single): Single;
begin
  Result := ((H - L + 1) * Random + L);
end;

procedure TForm1.btnFuncRandomClick(Sender: TObject);
begin
    Log(Format(cnFloat4, [RandomFloat(0,1)]));
    Log(Format(cnFloat4, [RandomFloatA(0,1)]));
end;

RandomFloatA 有边界问题
0.2729
1.3433
Author: skyjacker    Time: 2007-2-9 12:00

// 随机生成某一范围的浮点数
RandomFloat也需要做边界检查
function RandomFloat(L, H: Single): Single;
begin
  if L > =H then
  begin
    Result := H;
    exit;
  end;
  repeat
    Result := Random * H;
  until (Result > L);
end;

[ 本帖最后由 skyjacker 于 2007-2-9 15:00 编辑 ]
Author: kendling    Time: 2007-2-9 15:07

我那个是从VB里转过来的,可能对整数没这个问题。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0