我想在1到10之间生成一个唯一的随机数字。如果重复输入一个数字,则脚本应跳过该数字并尝试另一个。如果没有唯一编号,则应生成一条消息。有什么逻辑可以实现这个概念?
public int number;
void Update () {
if(Input.GetKeyDown(KeyCode.A))
{
number= Random.Range(1,10);
}
}
编辑:这不是用户发布的链接的重复,因为我试图生成唯一的数字,并且如果重复特定的数字,脚本将忽略它并尝试寻找另一个数字。
答案 0 :(得分:3)
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;
}
}
评论后编辑:
这个问题与this other question非常相似。但是Unity.Random与System.Random不同。
另一个问题中提供的答案也适用于此。但是我们在这里有更多选择。
答案 1 :(得分:1)
正如大家在评论中建议的那样,改组可能会起作用:
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");
}
}
}
}