gpt4 book ai didi

delphi - TStringList .add 从随机函数中生成重复项

转载 作者:行者123 更新时间:2023-12-03 05:10:10 28 4
gpt4 key购买 nike

遇到一个我似乎无法指出的问题。我试图从函数调用中收集字符串(带有字母和数字的随机代码)并将其放入我的 TStringList 变量中。相关代码如下。

如果我运行测试,字符串会重复给定的时间,然后生成一个新的字符串。如果我在每次生成代码后引入 sleep(xx) 或 showmessage 命令(请参阅下面的“编辑”),它会复制/返回备忘录,一切看起来都很好。如果我删除“延迟”,我会再次从函数中得到重复。

添加到TStringList的函数部分:

..

 AddToMemo:=TStringList.Create;
AddToMemo.Clear;
AddToMemo.Sorted:=False;
for loop := 1 to totalamount do
begin
sResult:=MakeCode(charspercode, cbUpperLowerCase, cbAvoidChars, customchars);

Sleep(50);
// (or):
//ShowMessage(sResult);

// ^ If I leave a Sleep or ShowMessage in, I can see sResult just fine and
// program works fine - results in memo are correct as well. If I remove
// it, I get repeated entries.

AddToMemo.add(sResult+IntToStr(loop));

// If I remove "sResult+" from AddToMemo.add the ".add"
// works - shows loop numbers in my updated memo
// If left in, I see one code (1st one produced) and no
// appended number at all in Memo produced.

end;
Result:=AddToMemo;
end;

编辑:正如我在下面提到的,如果我在 .add 之间留下 ShowMessage 或 Sleep(xx) 调用以暂停,它可以正常工作。如果我删除它,我会在最终的 tmemo 中得到一堆重复的条目。编辑: MakeCode 是一个返回单个随机字符+数字字符串(A..Z a..z 0..9)的函数。它本身就可以很好地工作。

(编辑答案 2)

没有出现异常。

因此,如果我不包含 sleep(),它可能会生成 500 个字符串,但它们都是重复的;经过一定时间后,它确实会发生变化。当我增加 sleep 命令时,函数调用的重复次数会减少。 sleep 时(40)左右;它从功能上正确显示。但这当然是耗时且 Not Acceptable 。

MakeCode() 的“本质”

function MakeCode(CharsPerCode: Integer; bULCase, bAvoidChars: Boolean; sCChars: String): String;


var
i: integer;
s: string;


begin
//(misc stuff here)

begin
randomize;
s[0]:=chr(CharsPerCode);
for i:=1 to CharsPerCode do
repeat
s[i]:=chr(random(128));
until
(s[i] in ['A'..'Z','a'..'z','0'..'9'])
end;

Result:=s;
end;

最佳答案

这是 Randomize 的行为。随机数生成器通过系统时钟的计算来初始化。如果您在快速循环的每次迭代中调用它,它将使用相同的种子进行初始化。这就是 Sleep(50) 改变结果的原因。例如,在开始填充字符串列表之前调用一次 randomize。

...
AddToMemo.Clear;
AddToMemo.Sorted:=False;
Randomize; // <-- possibly here
for loop := 1 to totalamount do

...

function MakeCode(CharsPerCode: Integer; bULCase, bAvoidChars: Boolean; sCChars: String):

...
begin
// randomize; // <-- not here!
s[0]:=chr(CharsPerCode);


以下引用来自 Delphi documentation :

Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.

关于delphi - TStringList .add 从随机函数中生成重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700175/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com