// 大家仔细看下面的代码,最好运行一遍,看看结果,是不是比较晕?
// 
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function GenerateRandomNum(const Count: Integer): string;
    function GenerateRandomNum2(const Count: Integer): string;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.GenerateRandomNum(const Count: Integer): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Count do
  begin
    Randomize;
    Result := Result + IntToStr(Random(2));
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GenerateRandomNum(10));  // 只有 0000000000 和 1111111111 两种结果;
  ShowMessage(GenerateRandomNum2(10)); // 我想要得结果;
end;function TForm1.GenerateRandomNum2(const Count: Integer): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Count do
  begin
    Randomize;
    Result := Result + IntToStr(Random(2));
    ShowMessage(Result);     // 只多了这么一行,结果......!!!
  end;  
end;end.

解决方案 »

  1.   

    function TForm1.GenerateRandomNum(const Count: Integer): string;
    var
      i: Integer;
    begin
      Result := '';
      Randomize;//这个应该写在循环的外面。 
                
      for i := 1 to Count do
      begin
        
        Result := Result + IntToStr(Random(2));
      end;
    end;
      

  2.   

    To  lili1(离奇):
    你的方法是对的,但是我搞不懂为什么会出现这样的情况?
    多一个ShowMessage结果就对了,这算Randomize和Random的Bug吗?
      

  3.   

    楼主注意,在执行showmessage()过程时,你调用了Randomize()函数,因为此函数是计算随机数,因此就是上面的结果.
      

  4.   

    To  saien(有问必答) :
    我不知道你说的对不对,但是你设断点调试:
    //
    function TForm1.GenerateRandomNum(const Count: Integer): string;
    var
      i: Integer;
    begin
      Result := '';
      for i := 1 to Count do
      begin
        Randomize;
        Result := Result + IntToStr(Random(2));  // 在这里设断点,
                                                 //你会发现结果又是对的!!!
      end;
    end;
      

  5.   

    Randomize的功能是根据系统的时间初始化随机种子Seed。 
    由于每次执行Randomize的时间间隔太短。他生成的随机种子Seed一样。
    而Random又是根据一个固定算法(例如简单的: 结果:=Seed*3 mod 5 )
    所以这时Random的结果也一样。按照我的修改以后,
    由于Random得出结果后也会修改随机种子Seed,所以Random的结果就随机了(假随机)。
      

  6.   

    至于你说的在那里设断点就对了。
        Randomize;
        Result := Result + IntToStr(Random(2));  // 在这里设断点,
                                                 //你会发现结果又是对的!!!
    是因为时间变化以后Randomize出来的Seed也不同。
    如果你不设断点。下面这样做因该也是对的。
        Randomize;
        Sleep(2000);//可能时间还可以设得更短。    Result := Result + IntToStr(Random(2));                                           
      

  7.   

    To lili1(离奇) :
    谢谢你,俺明白了,原来Randomize是按时间播种的,
    那么可不可以自己设置播种机制呢?
      

  8.   

    可以为全局变量 RandSeed 赋自己的种子值。