51 lines
1.4 KiB
C#
51 lines
1.4 KiB
C#
|
||
// using System;
|
||
using System.Collections.Generic;
|
||
|
||
namespace EventCubeMelt.Utils
|
||
{
|
||
class UniqueRandom99
|
||
{
|
||
private readonly List<(int r, int c)> _pool = new List<(int, int)>();
|
||
// private readonly Random _rng = new Random();
|
||
private int _idx = 0;
|
||
|
||
public UniqueRandom99(int[,] arr)
|
||
{
|
||
int m = arr.GetLength(0);
|
||
int n = arr.GetLength(1);
|
||
for (int i = 0; i < m; i++)
|
||
for (int j = 0; j < n; j++)
|
||
if (arr[i, j] == 99)
|
||
_pool.Add((i, j));
|
||
Shuffle(); // 初始随机化
|
||
}
|
||
|
||
/// <summary>
|
||
/// 返回一个从未返回过的 99 坐标;若数组里本来就没有 99,则一直返回 (-1,-1)
|
||
/// 所有 99 用完后自动洗牌进入下一轮。
|
||
/// </summary>
|
||
public (int r, int c) Next()
|
||
{
|
||
if (_pool.Count == 0) return (-1, -1);
|
||
|
||
if (_idx == _pool.Count) // 本轮用完,重置并洗牌
|
||
{
|
||
// _idx = 0;
|
||
// Shuffle();
|
||
return (-1, -1);
|
||
}
|
||
|
||
return _pool[_idx++];
|
||
}
|
||
|
||
private void Shuffle()
|
||
{
|
||
for (int i = _pool.Count - 1; i > 0; i--)
|
||
{
|
||
var j = UnityEngine.Random.Range(0, i + 1);
|
||
(_pool[i], _pool[j]) = (_pool[j], _pool[i]);
|
||
}
|
||
}
|
||
}
|
||
} |