Delphi Random在低范围内返回零
我正在使用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时,它似乎总是给我0Delphi 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
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;