我想列出一个名单,然后随机选择,但所有这些都应该被调用。当然不会重复。德尔福代码
答案 0 :(得分:2)
听起来你想要Fisher-Yates洗牌。 Sample code
答案 1 :(得分:1)
我的建议是制作一个名单列表,然后将名称随机播放,然后逐个调用。 我希望这段代码能为你效劳。
...
private
{ Private declarations }
FNameList : TStringList;
FNameIndex: Integer;
public
{ Public declarations }
end;
...
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
Randomize;
FNameIndex := 0;
FNameList := Tstringlist.Create;
// FNameList.LoadFromFile('NameList.txt'); or
FNameList.Add('Name 1');
FNameList.Add('Name 2');
FNameList.Add('Name 3');
FNameList.Add('Name 4');
FNameList.Add('Name 5');
FNameList.Add('Name 6');
for i:= 1 to 100 do // shuffle 100 times. its up to you
FNameList.Exchange(Random(FNameList.Count-1), Random(FNameList.Count-1));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FNameList.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if FNameIndex < FNameList.Count then
begin
showmessage(FNameList.Strings[FNameIndex]);
inc(FNameIndex);
end else showmessage('Done!');
end;
答案 2 :(得分:0)
好吧,我无法为您提供delphi代码,但我在这里遇到了同样的问题。我正在使用此网站http://de.fakenamegenerator.com的名称列表(带地址)。
也许这有点帮助。
答案 3 :(得分:0)
我不是在使用delphi,但算法很直接。只需使用随机生成的索引将名称插入List即可。这样您就可以随机排序名称列表。然后迭代它。
答案 4 :(得分:0)
将名称副本复制到List中并执行以下命令:
// assuming list is a stringlist containing the names
while List.Count > 0 do begin
idx := Random(List.Count);
// do something with List[idx]
List.Delete(idx);
end;