// 大家仔细看下面的代码,最好运行一遍,看看结果,是不是比较晕?
//
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.
//
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.
解决方案 »
- 如何模拟桌面右键刷新??
- 用OpenPictureDialog只能导入*.bmp文件,如果导*.jpg文件用什么命令?
- 急问如何建一个数据库,只要把数据库文件拷到其它电脑里就能运行,不用过多的配置
- SQL数据库里有一个日期时间字段,用DBGrid控件显示,如何将日期时间完全显示出来?
- 高手请进
- 各位大侠,快来帮帮忙了!!毕业设计急需解决的问题,请一定援手
- 救命啊!!!在线等待,,还有一个小时要交货给人!!!
- 怎么对dbf数据库操作?
- 有一个问题挺棘手,关于多重查询的问题,谁能解决,100分献上.急.
- 怎样为parodox表设置副索引?能否在设计期间指定副索引?
- 用indy9的idpop3收信后应该怎样解码?
- 高分相送!不够再开贴
var
i: Integer;
begin
Result := '';
Randomize;//这个应该写在循环的外面。
for i := 1 to Count do
begin
Result := Result + IntToStr(Random(2));
end;
end;
你的方法是对的,但是我搞不懂为什么会出现这样的情况?
多一个ShowMessage结果就对了,这算Randomize和Random的Bug吗?
我不知道你说的对不对,但是你设断点调试:
//
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;
由于每次执行Randomize的时间间隔太短。他生成的随机种子Seed一样。
而Random又是根据一个固定算法(例如简单的: 结果:=Seed*3 mod 5 )
所以这时Random的结果也一样。按照我的修改以后,
由于Random得出结果后也会修改随机种子Seed,所以Random的结果就随机了(假随机)。
Randomize;
Result := Result + IntToStr(Random(2)); // 在这里设断点,
//你会发现结果又是对的!!!
是因为时间变化以后Randomize出来的Seed也不同。
如果你不设断点。下面这样做因该也是对的。
Randomize;
Sleep(2000);//可能时间还可以设得更短。 Result := Result + IntToStr(Random(2));
谢谢你,俺明白了,原来Randomize是按时间播种的,
那么可不可以自己设置播种机制呢?