C# 使用Fisher-Yates Shuffle的随机XML问题
我正在做一个小测验/琐事游戏,将问题存储在XML文件中,它会得到一个随机问题。一切都很好,但我想保持随机性,但在每个问题都显示出来之前,不要显示相同的问题C# 使用Fisher-Yates Shuffle的随机XML问题,c#,shuffle,C#,Shuffle,我正在做一个小测验/琐事游戏,将问题存储在XML文件中,它会得到一个随机问题。一切都很好,但我想保持随机性,但在每个问题都显示出来之前,不要显示相同的问题 public struct Question { public string questionText; public string answerA; public string answerB; public string answerC; public string answerD; public int correctAn
public struct Question {
public string questionText;
public string answerA;
public string answerB;
public string answerC;
public string answerD;
public int correctAnswerID;
}
[XmlRoot("QuestionsRoot")]
public class QuestionData {
[XmlArray("Questions")]
[XmlArrayItem("Question")]
public List<Question>questions = new List<Question>();
public static QuestionData LoadFromText(string text) {
try {
XmlSerializer serializer = new XmlSerializer(typeof(QuestionData));
return serializer.Deserialize(new StringReader(text)) as QuestionData;
} catch (Exception e) {
UnityEngine.Debug.LogError("Exception loading question data: " + e);
return null;
}
}
按照以下思路做一些事情: 创建另一个包含可用问题的列表-将其初始化到所有问题列表中:
questionData = QuestionData.LoadFromText(questionDataXMLFile.text)
var available = new List<Question>(questionData.question);
...
}
public Question GetNextQuestion()
{
if (available.Count == 0)
available.AddRange(questionData.question);
q = Random.Range(0, available.Count);
currentQuestion = available[q];
available.RemoveAt(q);
return currentQuestion;
}
questionData=questionData.LoadFromText(questionDataXMLFile.text)
可用变量=新列表(questionData.question);
...
}
公共问题GetNextQuestion()
{
如果(可用。计数==0)
可用.AddRange(questionData.question);
q=随机范围(0,可用.Count);
currentQuestion=可用[q];
可用。RemoveAt(q);
返回问题;
}
如果你问如何实现fisher yates,这个网站和维基百科上有很多例子。如果您确实尝试过实现它,我们需要查看该代码,您需要解释它的错误。@Blorgbeard我尝试了for(int I=1;IQuestion x
而不是string x
。另外,为什么不在原始帖子中发布该代码和错误?为了得到帮助,你需要解释你的实际问题。请注意,您可以删除您的帖子!好的,我会的。谢谢你Op提到了shuffle,但这不是。不过,这仍然有效。
questionData = QuestionData.LoadFromText(questionDataXMLFile.text)
var available = new List<Question>(questionData.question);
...
}
public Question GetNextQuestion()
{
if (available.Count == 0)
available.AddRange(questionData.question);
q = Random.Range(0, available.Count);
currentQuestion = available[q];
available.RemoveAt(q);
return currentQuestion;
}