Unity:进行最多20个问题的10题选择题游戏。
Unity: 获取20个问题中最多10个问题的多选题游戏
在这篇文章中,我们将讨论如何在Unity中创建一个多选题游戏,并限定最多只能选择10个问题。我们将介绍一种名为“选择抽样”的技术来实现这个目标。
首先,我们需要遍历每个问题,并为每个问题设置选择的概率。概率的计算公式是:(所需数量)/(剩余数量)。例如,如果我们有40个问题,那么第一个问题被选中的概率为5/40。如果第一个问题被选中了,那么下一个问题的概率为4/39;否则,下一个问题的概率为5/39。通过这种方式,我们可以在到达最大数量之前选择出5个问题,并且通常在此之前就会选择出所有问题。
这种技术被称为“选择抽样”,它是“蓄水池抽样”的一种特殊情况。与打乱输入数据相比,这种技术的性能相似,但不需要修改原始数据就可以生成样本。
下面是一个实现这种技术的示例代码:
int maxQuestions = 10; // 最大问题数量 int remainingQuestions = 20; // 剩余问题数量 ListallQuestions = GetQuestions(); // 获取所有问题的列表 List selectedQuestions = new List (); // 选择的问题列表 for (int i = 0; i < allQuestions.Count; i++) { float probability = (float)maxQuestions / remainingQuestions; // 计算选择概率 if (Random.value < probability) { selectedQuestions.Add(allQuestions[i]); // 将问题添加到选择列表中 maxQuestions--; // 减少所需问题数量 } remainingQuestions--; // 减少剩余问题数量 }
以上代码中,我们使用了一个循环来遍历所有问题。在每次循环中,我们计算出当前问题的选择概率,并使用Random.value函数生成一个随机数。如果随机数小于选择概率,我们将当前问题添加到选择列表中,并减少所需问题数量。最后,我们减少剩余问题数量,继续下一个循环。
通过这种方式,我们可以在保持性能的同时,选择出最多10个问题来创建多选题游戏。希望这篇文章对你有所帮助!
Unity: 获取最多10个问题中的20个问题的多选题游戏
在Unity中开发一个多选题游戏时,需要从一个包含20个问题的列表中随机选择最多10个问题。为了实现这个功能,我们可以使用下面的代码段:
public static List<T> GetRandomElements<T>(this IEnumerable<T> list, int elementsCount) { return list.OrderBy(arg => Guid.NewGuid()).Take(elementsCount).ToList(); }
这段代码使用了Guid.NewGuid()
来进行排序,然后取出指定数量的元素。然而,Guid.NewGuid()
并不能保证随机性,只能保证唯一性。
为了解决这个问题,我们可以使用更可靠的随机数生成方法,例如使用System.Random
类来生成随机数。下面是修改后的代码:
public static List<T> GetRandomElements<T>(this IEnumerable<T> list, int elementsCount) { List<T> tempList = list.ToList(); List<T> randomElements = new List<T>(); System.Random random = new System.Random(); for (int i = 0; i < elementsCount; i++) { int randomIndex = random.Next(0, tempList.Count); randomElements.Add(tempList[randomIndex]); tempList.RemoveAt(randomIndex); } return randomElements; }
通过使用System.Random
类,我们可以确保获取到更可靠的随机数,从而保证游戏中的问题的随机性。
问题的出现原因:
在Unity中,有一个20个问题的问答游戏,需要从中随机选取10个问题。现在的问题是如何实现这个随机选取过程。
解决方法:
通过使用linq库中的OrderBy方法来实现随机选取。具体代码如下:
YourList.OrderBy(x => rnd.Next()).Take(10)
。
但是如果两个元素从rnd.Next()或类似的方法中获得相同的数值,那么第一个元素会被选中,而第二个元素可能不会被选中(如果不再需要更多的元素)。根据使用情况,这是足够随机的。
如果列表很小,代码简洁性是主要关注点,我会选择这种解决方法。但是如果这种方法会对整个列表进行枚举和排序,那么它的效率可能不高。
使用OrderBy方法只会对每个元素调用一次键选择器才能正常工作。如果OrderBy在比较两个元素时每次都调用键选择器,那么它会每次得到一个不同的值,从而破坏排序。文档中没有明确说明OrderBy的实现方式。
我的性能分析和日志显示,LINQ只对每个元素评估一次OrderBy表达式。如果以其他方式实现,昂贵的OrderBy表达式将会影响排序的性能。尽管契约没有保证这一点,但他们愚蠢到更改它。
需要注意的是,如果YourList中的元素很多,但只想选择其中几个,这种方法可能不太高效。