德尔福随机在低范围内返回零



我正在使用delphi 7,我试图将一组数字从一个列表框洗牌到另一个列表框。

02H,02D,02S,02C,03H,03D,03S,03C,10H,10D,10S,10C,11H,11D,11S,11C,20H,20D,20S,20C,30H,30D,30S,30C。

但不知为何,30C似乎总是排在最后, 当我随机 0,2 或 0,1 时,它似乎总是给我 0。

procedure TMainForm.btShuffleClick(Sender: TObject);
var I: integer;
begin
lstShufd.Clear;
while lstNew.Count <> 0 do
begin
Randomize; 
I:=RandomRange(0,lstNew.Count-1);
lstShufd.Items.Add(lstNew.Items.Strings[I]);
lstNew.Items.Delete(I);
end;
end;

您有两个错误:

  1. 您不能像在问题中那样反复打电话给Randomize。这样做会破坏随机序列的分布属性。典型的用法是在程序开始时调用Randomize一次。
  2. RandomRange返回一个值I范围AFrom <= I < ATo。所以你传递了错误的参数。使用RandomRange(0, lstNew.Count)甚至只是Random(lstNew.Count).

这些错误中的第二个解释了您观察到的行为。在您的代码中,通过调用RandomRange(0, lstNew.Count-1)你会得到一个范围0 <= I < lstNew.Count-1的值,因此在循环的最后一次迭代之前,lstNew中的最后一项,即具有索引lstNew.Count-1的项。

RandomRange的文档说:

function RandomRange(const AFrom, ATo: Integer): Integer;

描述

返回指定区域中的随机整数。

随机范围从扩展的范围返回一个随机整数 在 AFrom 和 ATo 之间(不包括)。随机范围可以处理负数 范围(其中 AFrom 大于 ATo)。

最新更新