Создать уникальное случайное число от 1 до 10? - PullRequest
2 голосов
/ 09 июля 2019

Я хочу сгенерировать уникальную случайную цифру от 1 до 10. Если число повторяется, сценарий должен пропустить число и попробовать другое.Если не осталось уникальных номеров, то должно быть сгенерировано сообщение.Любая логика, чтобы реализовать эту концепцию?

public int number; 

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

РЕДАКТИРОВАТЬ: Это не дубликат ссылки, опубликованной пользователем, так как я пытаюсь сгенерировать уникальный номер, и если конкретное число повторяется, скрипт игнорирует егои пытается найти другой номер.

Ответы [ 2 ]

3 голосов
/ 09 июля 2019
  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;
    }
}

РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИЙ:
Этот вопрос очень похож на этот другой вопрос .Но Unity.Random отличается от System.Random .

Здесь также работают ответы, предложенные в другом вопросе.Но у нас есть больше вариантов здесь.

1 голос
/ 09 июля 2019

Как ребята предложили в комментариях, тасование может сработать:

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");
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...