Delphi Random 在低范围内返回零

标签 delphi

我正在使用 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返回值 IAFrom <= 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/

相关文章:

mysql - 未知的 MYSQL 服务器主机 'ServerName' (11001)

delphi - 从 MSBuild 在 OS X 上运行 Delphi 程序

delphi - 如何找到指针引用的内存大小?

delphi - 如何在 ProfileResourceReceived 事件中从 ARemoteResource 获取 TTetheringProfileInfo?

delphi - DUnit 无法创建表单。当前没有处于事件状态的 MDI 表单

Delphi 应用程序中的 Javascript

delphi - TAction.OnUpdate 事件会降低性能吗?

mysql - 保持 zTable 始终打开是可取的吗?

delphi - 如何在 Delphi 7 中禁用 CPU 窗口

带有 Ssl 连接超时 10060 的 Delphi XE7 Indy Rest Api 帖子