生成1到10之间的唯一随机数?

时间:2019-07-09 08:56:40

标签: c# unity3d

我想在1到10之间生成一个唯一的随机数字。如果重复输入一个数字,则脚本应跳过该数字并尝试另一个。如果没有唯一编号,则应生成一条消息。有什么逻辑可以实现这个概念?

public int number; 

    void Update () {
        if(Input.GetKeyDown(KeyCode.A))
        {
          number= Random.Range(1,10);
        }
    }

编辑:这不是用户发布的链接的重复,因为我试图生成唯一的数字,并且如果重复特定的数字,脚本将忽略它并尝试寻找另一个数字。

2 个答案:

答案 0 :(得分:3)

  1. 在唤醒时设置一个包含所有有效值的列表
  2. 从列表中获取随机值
  3. 从列表中删除值,以避免重复
  4. 奖金-您还可以扩展该类以设置任何最小和最大数字
public class RandomGenerator : MonoBehaviour
{
    public int minNumber = 1;
    public int maxNumber = 10;

    private List<int> _validNumbers;

    public int number;

    private void Awake()
    {
        _validNumbers = new List<int>();
        for (int i = minNumber; i <= maxNumber; i++)
            _validNumbers.Add(i);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            if (_validNumbers.Count == 0)
                Debug.Log("No valid Numbers");
            else
                number = GetRandomNumber();
        }
    }

    private int GetRandomNumber()
    {
        var nextIndex = Random.Range(0, _validNumbers.Count - 1);
        var result    = _validNumbers[nextIndex];
        _validNumbers.RemoveAt(nextIndex);
        return result;
    }
}

评论后编辑:
这个问题与this other question非常相似。但是Unity.RandomSystem.Random不同。

另一个问题中提供的答案也适用于此。但是我们在这里有更多选择。

答案 1 :(得分:1)

正如大家在评论中建议的那样,改组可能会起作用:

public class Shuffler
{
    private readonly Queue<int> _queue;

    public Shuffler(int max)
    {           
        _queue = new Queue<int>(Enumerable.Range(1, max).OrderBy(x => UnityEngine.Random.value));
    }

    public bool TryGetNext(out int item)
    {
        if(_queue.Count == 0)
        {
            item = -1;
            return false;
        }

        item = _queue.Dequeue();
        return true;
    }
}

为了完整起见,请添加MonoBehaviour,例如

public class RandomNumber : MonoBehaviour
{
    private Shuffler _shuffler;

    public int number;

    private void Awake()
    {
        _shuffler = new Shuffler(10)
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            if(!_shuffler.TryGetNext(out number))
            {
                Debug.Log("No valid Numbers");
            }
        }
    }
}