问:我有两个带有4个字符串的列表。我将它们混洗,然后在每个列表中选择一个字符串以从两个列表中创建字符串的组合。我希望将四个组合(如下所示)重复四次(因此总共有16个组合),但是这些组合中的每一个都应以随机顺序显示。
Dog
Lion
Dog and car
Lion and car
从这段代码中,我对字符串进行混洗,然后从每个列表中选择第一个字符串,使用for循环进行迭代,然后生成16个组合。这段代码可以随机播放,选择并且打印效果很好, 但会 打印第一个选定的字符串-4次,然后打印第二个选定的字符串-4次。因此,除了顺序不是随机的之外,其他一切都很好。因此,如果从第一个列表中选择dog,它将打印:dog,dog和car,dog,dog和car,然后它将对狮子执行此操作(用于接下来的4个打印)。因此,它将始终打印从第一个列表中选择的字符串的4倍。而我希望这些选择是随机的。任何意见将是有益的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System;
using System.Linq;
public class randomLetters : MonoBehaviour
{
List<string> mylist = new List<string>();
List<string> mylist2 = new List<string>();
string selected;
string selected2;
void Start()
{
mylist.Add("dog");
mylist.Add("lion");
mylist.Add("dog");
mylist.Add("lion");
mylist2.Add("carfordog");
mylist2.Add("carforlion");
mylist2.Add("carfordog");
mylist2.Add("carforlion");
Shuffle(mylist);
Shuffle(mylist2);
StartCoroutine(Wait());
}
IEnumerator Wait()
{
for (int i = 0; i < 4; i++)
{
selected = mylist[i];
for (int j = 0; j < 4; j++)
{
selected2 = mylist2[j];
if (selected == "dog" && selected2 == "carfordog")
{
Debug.Log("Dog and Car");
}
else if (selected == "dog" && selected2 == "carforlion")
{
Debug.Log("Dog ");
}
else if (selected == "lion" && selected2 == "carforlion")
{
Debug.Log("Lion and Car ");
}
else if (selected == "lion" && selected2 == "carfordog")
{
Debug.Log("Lion");
}
yield return new WaitForSeconds(1);
}
yield return new WaitForSeconds(1);
}
}
void Shuffle(List<string> lists)
{
for (int j = lists.Count - 1; j > 0; j--)
{
int rnd = UnityEngine.Random.Range(0, j + 1);
string temp = lists[j];
lists[j] = lists[rnd];
lists[rnd] = temp;
}
}
}
答:您可以使用 Mersenne Twister 生成随机数。 Mersenne Twister 是一个伪随机 数 生成器,为数字创建2个数组1,为随机值创建1个。这两个数组应相互映射。然后对数字数组进行排序,并根据随机值数组中的新排序数组获取值。