如何随机化不重复的名称?

时间:2010-08-05 07:01:10

标签: delphi list sorting random

我想列出一个名单,然后随机选择,但所有这些都应该被调用。当然不会重复。德尔福代码

5 个答案:

答案 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;