我有数组fe(1,2,3,4,5),而我想在开始时仅显示此数字fe(4,3,2,1,5)的随机顺序,我写了函数,但是它重复相同的数字,但顺序没有变化。我的代码如下;
public void Shuffle()
{
for (int i = 0; i < lists[BrojLevela].Length ; i++)
{
int rnd = Random.Range(0, lists[BrojLevela].Length);
tempGO = lists[BrojLevela][rnd];
lists[BrojLevela][rnd] = lists[BrojLevela][i];
lists[BrojLevela][i] = tempGO;
}
}
Random.Range是一个Unity类,用于生成伪随机数,但是如果提供相同的范围,根据某些文档,它实际上会提供可重复的结果。如果将其更改为使用System.Random类,则它对我有用。
只需更改:
int rnd = Random.Range(0, lists[BrojLevela].Length);
收件人:
int rnd = new Random().Next(0, lists[BrojLevela].Length);
这是使代码示例按预期工作的最简单的更改,但是,最好在循环外部创建Random对象的实例并对其进行缓存,因为不需要每次都创建一个新的对象。
我刚刚测试了它,它应该可以工作:
private IList<int> strList = new List<int>();
void Start()
{
strList.Add(1);
strList.Add(2);
strList.Add(3);
strList.Add(4);
strList.Add(5);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
Shuffle(strList);
foreach(int a in strList)
{
Debug.Log(a.ToString());
}
}
}
public void Shuffle<T>(IList<T> list)
{
int n = list.Count;
int rnd = Random.Range(0, n-1);
while (n > 1)
{
n--;
int k = rnd;
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}