前段时间我帮助制作了一个生成三个不同字母的程序,问题是当我使用视觉形式顺利但是当我在程序控制台程序中使用它总是生成相同的3个字母在这种情况下我总是返回AAW
代码。
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
function gen(): string;
var
aleatorio: Integer;
iz: Integer;
var
finalr: string;
begin
finalr := '';
finalr := finalr + Chr(ord('A') + Random(26));
finalr := finalr + Chr(ord('A') + Random(26));
finalr := finalr + Chr(ord('A') + Random(26));
Result := finalr;
end;
begin
try
Writeln(gen());
readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
有什么问题?
答案 0 :(得分:10)
忘记致电Randomize
begin
try
Randomize;
Writeln(gen());
..
答案 1 :(得分:3)
Delphi的随机数生成器是基于线性同余生成器的伪随机数。这种发电机产生确定性输出。当您从相同的状态或种子开始时,将生成相同系列的值。除非您提供种子,否则将使用默认种子。这解释了为什么重复运行会产生相同的输出 - 每次运行时RNG都会以相同的种子开始。
为了解决这个问题,你应该为每次运行给RNG一个不同的种子。例如,只需在程序开头添加对Randomize的调用即可。这将基于系统时间为RNG播种。这并不总是种子RNG的最佳方式,但它可能足以满足您的需求。
你应该什么时候种下你的RNG?通常你会在流程开始时播种一次,就是这样。当您需要重现伪随机序列时,您将偏离该策略。换句话说,有些情况下您实际上需要您观察到的行为。在这种情况下,您需要捕获RNG的状态,然后每次需要重现特定序列时,都可以恢复该状态。