【问题标题】:Random name generator without duplicates in unity统一无重复的随机名称生成器
【发布时间】:2022-01-30 10:19:56
【问题描述】:

我正在尝试创建一个列表,该列表打印出我统一附加到游戏对象的随机名称。我将如何停止重复?

using TMPro;

public class Names : MonoBehaviour
{
    public List<string> names = new List<string>();
    public TMP_Text text;

    private void Start()
    {
        string wordToDisplay = RandomWord();

        text.text = wordToDisplay;
    }

    private string RandomWord()
    {
        {
            string randomName = names[Random.Range(0, names.Count)];
                       
            return randomName;
        }

    }
}

【问题讨论】:

  • 如果您从集合中删除使用过的名称怎么办?这将保证唯一性。
  • 你至少需要记录我认为使用过的名字
  • 意识到想要选择随机值而不替换在逻辑上与将列表洗牌一次并只是按顺序使用值。

标签: c# random


【解决方案1】:

使用这样的东西:

private Stack<string> _randomNames = null;
private string RandomWord()
{
    if (_randomNames == null || _randomNames.Count == 0)
    {
        _randomNames = new Stack<string>(names.OrderBy(n => Random.Range(0, int.MaxValue)));
    }
    return _randomNames.Pop();
}

它实际上是对列表进行随机排序,然后一次选择一个值。

【讨论】:

  • 关于这一点需要注意 - 如果它附加到场景中的多个对象,它们将分别通过列表的单独副本,因此它不会停止重复 - 此代码需要在名称分布对象上,然后与名称行为共享(OPs 代码从列表中选择一个名称,然后将该代码添加到多个对象)
【解决方案2】:

正如 Uriil 在评论中提到的,您可以在调用 RandomWord 时从列表中删除新名称以保证唯一性。以下是如何实现此目的的示例:

private string RandomWord()
{
    int index = Random.Range(0, names.Count);
    
    string randomName = names[index];
    names.RemoveAt(index);
    
    return randomName;
}

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 2021-12-18
    • 2015-06-22
    • 2013-01-19
    • 2011-09-18
    • 2018-06-25
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多