using UnityEngine; using UnityEngine.UI; using System.Collections; using System; using System.Collections.Generic; namespace MoreMountains.Tools { /// /// A class to use to get more controlled randomness, taking values out of the bag randomly, and never getting them again. /// /// Usage : /// /// var shuffleBag = new ShuffleBag(40); /// for (int i = 0; i<40; i++) /// { /// newValue = something; /// shuffleBag.Add(newValue, amount); /// } /// /// then : /// float something = shuffleBag.Pick(); /// /// public class MMShufflebag { public int Capacity { get { return _contents.Capacity; } } public int Size { get { return _contents.Count; } } protected List _contents; protected T _currentItem; protected int _currentIndex = -1; /// /// Initializes the shufflebag /// /// public MMShufflebag(int initialCapacity) { _contents = new List(initialCapacity); } /// /// Adds the specified quantity of the item to the bag /// /// /// public virtual void Add(T item, int quantity) { for (int i = 0; i < quantity; i++) { _contents.Add(item); } _currentIndex = Size - 1; } /// /// Returns a random item from the bag /// /// public T Pick() { if (_currentIndex < 1) { _currentIndex = Size - 1; _currentItem = _contents[0]; return _currentItem; } int position = UnityEngine.Random.Range(0, _currentIndex); _currentItem = _contents[position]; _contents[position] = _contents[_currentIndex]; _contents[_currentIndex] = _currentItem; _currentIndex--; return _currentItem; } } }