【问题标题】:Generate random number in delphi在delphi中生成随机数
【发布时间】:2015-12-27 15:42:31
【问题描述】:

我想在 delphi 中创建一个随机数并将其作为文件名分配给文件。我设法做到了,但是当我单击按钮生成数字时,它总是以 0 开头。知道如何解决它

procedure TForm1.Button1Click(Sender: TObject);
var
test:integer;

begin
test:= random(8686868686868);

edit1.Text:= inttostr(test);
end;

end.

【问题讨论】:

    标签: delphi random


    【解决方案1】:

    正如 user246408 所说,您应该使用Randomize 用随机值初始化随机数生成器。此外,如果您想将返回的数字限制为正整数,请使用预定义的 MaxInt 常量。

    返回integer 的重载函数System.Random 具有以下签名:

      function Random(const ARange: Integer): Integer;
    

    并返回满足公式0 <= X < ARange 的整数X。 为了防止 0 值,您可以添加一个您选择的常量,例如

    procedure TForm17.Button2Click(Sender: TObject);
    const
      MinRandomValue = 100000;
    var
      test:integer;
    begin
      test:= random(MaxInt-MinRandomValue)+MinRandomValue;
      edit1.Text:= inttostr(test);
    end;
    

    (从 MaxInt 中减去 MinRandomValue 以防止溢出)

    或者,您可以使用 System.Math.RandomRange

    test := RandomRange(100000, MaxInt);
    

    记录在案的here

    【讨论】:

      【解决方案2】:

      您的代码有 2 个问题。

      1. 你不打电话给Randomize,这就是为什么你总是得到零作为 第一个“随机”值。

      2. 你对Random范围使用了太大的值8686868686868,它 超过 32 位边界,相当于2444814356

      如果您只需要一个“随机”值,请使用

      procedure TForm1.Button1Click(Sender: TObject);
      var
        test:integer;
      
      begin
        Randomize;
        test:= random($7FFFFFFF);
      
        edit1.Text:= inttostr(test);
      end;
      

      【讨论】:

      • 您不能在一个应用程序中多次调用Randomize
      • @SirRufo 不存在这样的限制;您可以在应用程序中多次调用Randomize
      • 你不应该重复调用 Randomize。通常启动一次就足够了。
      • @user246408:如果您连续快速调用Randomize 后跟RandomRandom 可能会返回相同的值或与前一个值相差几个数字的值。这不是随机的。如文档中所述,您应该仅使用 Randomize 一次或非常谨慎地使用。该文本仍然有效。
      • 我知道随机意味着什么以及应该如何使用它。 (几乎)连续的数字不是随机的。仅使用一次 Randomize (或至少少量使用)的建议不仅可以接受,而且是很好的建议,无论您怎么想。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2011-09-05
      • 2012-12-16
      相关资源
      最近更新 更多