private void CreateOrDestroyAndSetItems(System.Func <int, int> valueGenerator, System.Func <int, int, float> weightGenerator)
        {
            if (_selectedItemPanel != null)
            {
                _selectedItemPanel.selected = false;
            }

            while (_itemPanels.Count < quantityOfItems)
            {
                WeightedShuffleItemPanel itemPanel = Instantiate(weightedShuffleItemPrefab);
                itemPanel.transform.SetParent(itemsPanel, false);
                _itemPanels.Add(itemPanel);
            }

            while (_itemPanels.Count > quantityOfItems)
            {
                Destroy(_itemPanels[_itemPanels.Count - 1].gameObject);
                _itemPanels.RemoveAt(_itemPanels.Count - 1);
            }

            _items.Clear();

            for (int i = 0; i < _itemPanels.Count; ++i)
            {
                int   value  = valueGenerator(i);
                float weight = weightGenerator(i, value);

                WeightedShuffleItemPanel itemPanel = _itemPanels[i];
                itemPanel.SetValue(value, _itemPanels.Count);
                itemPanel.SetWeight(Mathf.RoundToInt(weight), 99);

                _items.Add(new WeightedValue(value, weight));
            }
        }
        public void OnShuffle()
        {
            if (_selectedItemPanel != null)
            {
                _selectedItemPanel.selected = false;
            }

            _random.Shuffle(_items);

            for (int i = 0; i < _itemPanels.Count; ++i)
            {
                WeightedShuffleItemPanel itemPanel = _itemPanels[i];
                itemPanel.SetValue(_items[i].value, _itemPanels.Count);
                itemPanel.SetWeight(Mathf.RoundToInt(_items[i].weight), 99);
            }
        }
        private IEnumerator SelectRandomItem()
        {
            while (true)
            {
                WeightedShuffleItemPanel itemPanel = _itemPanels.RandomElement(_random);
                if (itemPanel != _selectedItemPanel)
                {
                    if (_selectedItemPanel != null)
                    {
                        _selectedItemPanel.selected = false;
                    }
                    _selectedItemPanel          = itemPanel;
                    _selectedItemPanel.selected = true;
                }

                yield return(Delay());
            }
        }
        private IEnumerator SelectWeightedRandomItem()
        {
            while (true)
            {
                int index = _random.WeightedIndex(_items.Count, (int i) => _items[i].weight);
                WeightedShuffleItemPanel itemPanel = _itemPanels[index];
                if (itemPanel != _selectedItemPanel)
                {
                    if (_selectedItemPanel != null)
                    {
                        _selectedItemPanel.selected = false;
                    }
                    _selectedItemPanel          = itemPanel;
                    _selectedItemPanel.selected = true;
                }

                yield return(Delay());
            }
        }