我正在使用 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;
最佳答案
你有两个错误:
- 你不能调用
Randomize
以你在问题中的方式重复。这样做会破坏随机序列的分布特性。典型用法是调用Randomize
在程序开始时一次。 -
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;
Description
Returns a random integer from a specified range.
RandomRange returns a random integer from the range that extends between AFrom and ATo (non-inclusive). RandomRange can handle negative ranges (where AFrom is greater than ATo).
关于Delphi Random 在低范围内返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20799555/