Delphi Random在低范围内返回零

Delphi Random在低范围内返回零,delphi,Delphi,我正在使用Delphi7,我正在尝试将一组数字从一个列表框移动到另一个列表框 02H、02D、02S、02C、03H、03D、03S、03C、10H、10D、10S、10C、11H、11S、11C、20H、20D、20S、20C、30H、30D、30S、30C 但出于某种原因,30摄氏度似乎总是最后一个, 当我随机选择0,2或0,1时,它似乎总是给我0 procedure TMainForm.btShuffleClick(Sender: TObject); var I: integer; beg

我正在使用Delphi7,我正在尝试将一组数字从一个列表框移动到另一个列表框

02H、02D、02S、02C、03H、03D、03S、03C、10H、10D、10S、10C、11H、11S、11C、20H、20D、20S、20C、30H、30D、30S、30C

但出于某种原因,30摄氏度似乎总是最后一个, 当我随机选择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;
procedure tmainefit.btshuffleck(发送方:TObject);
varⅠ:整数;
开始
lstShufd.Clear;
而lstNew.count0做什么
开始
随机化;
I:=随机范围(0,lstNew.Count-1);
lstShufd.Items.Add(lstNew.Items.Strings[I]);
删除(I)项;
结束;
结束;
您有两个错误:

  • 您不能像在问题中那样重复调用
    随机
    。这样做会破坏随机序列的分布特性。典型用法是在程序开始时调用
    随机化

  • RandomRange
    返回范围
    AFrom中的值
    I
    ,为什么在每个循环中调用
    Randomize
    ?它从时钟设置随机种子,因此您可能多次获得相同的值。在你的程序中只使用一次。要快速总结洗牌方法,请参阅。我想知道为什么这么多初学者在循环中调用
    Randomize
    。@FreeConsulting以获得更多的随机数!另一种方法是多次调用random以获得更随机的值。但它不是这样工作的。@LURD抱歉,没有意识到这一点:o)找到了一个“RandomRange从AFrom和ATo之间的范围返回一个随机整数(非包含)”。有些人应该总是阅读实际的文档,而不是低质量的DelphiBasics。好吧,我想它相当于W3Shool,但这是谷歌的第一个结果。为我辩护,我使用Delphi几乎是在十年前,当时它仍然归Borland所有。官方文件现在在哪里?@some,你已经在评论中链接了官方文件。虽然它是针对Delphi XE5的,但由于没有官方的Delphi 7联机帮助,因此它是您可以链接到的“最佳”帮助之一。据我记忆所及,Delphi 2009的联机帮助是(也许现在仍然是)最古老的Delphi版本联机帮助。@TLama当我链接到联机文档时,我会从URL中删除该版本。这样,链接将解析为最新版本,并且不会永远绑定到XE5。
    function RandomRange(const AFrom, ATo: Integer): Integer;