【问题标题】:how to randomize Names that is not repeated?如何随机化不重复的名称?
【发布时间】:2010-08-05 07:01:10
【问题描述】:

我想制作一个名称列表,然后随机选择,但应该调用所有名称。当然不会重复。德尔福代码

【问题讨论】:

    标签: delphi list sorting random


    【解决方案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;
    

    【讨论】:

    • 这个想法很好——打乱列表,然后遍历它。但是你的洗牌程序并不好。而是尝试这样的事情:for I := 0 to aList.Count-1 do aList.Exchange(I,randomrange(I,aList.Count));
    【解决方案2】:

    好吧,我无法为您提供 delphi 代码,但我在这里遇到了同样的问题。我正在使用来自该网站http://de.fakenamegenerator.com 的姓名列表(带有地址)。

    也许有点帮助。

    【讨论】:

      【解决方案3】:

      我不喜欢 delphi,但算法非常简单。只需将名称插入具有随机生成索引的列表即可。这样你就有了一个随机排序的名字列表。然后迭代它。

      【讨论】:

      • 是的,我做了什么,但是如果我使用随机(索引),则可能存在重复索引
      • 所以在插入前先检查列表元素是否为空。如果不为空,则生成一个新的随机索引。
      【解决方案4】:

      将名称复制到 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 2021-06-16
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多