簡體   English   中英

生成1到10之間的唯一隨機數?

[英]Generate a unique random number between 1 and 10?

我想生成一個介於1到10之間的唯一隨機數字。如果重復輸入一個數字,則腳本應跳過該數字並嘗試另一個。 如果沒有唯一編號,則應生成一條消息。 有什么邏輯可以實現這個概念?

public int number; 

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

編輯:這不是用戶發布的鏈接的重復,因為我試圖生成唯一的數字,並且如果重復特定的數字,腳本將忽略它並嘗試尋找另一個數字。

  1. 在Awake設置所有有效值的列表
  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;
    }
}

編輯后的評論:
這個問題與另一個問題非常相似。 但是Unity.RandomSystem.Random不同。

其他問題中提供的答案也可以在這里使用。 但是我們在這里有更多選擇。

正如大家在評論中建議的那樣,改組可能有效:

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");
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM