Unity:进行最多20个问题的10题选择题游戏。

8 浏览
0 Comments

Unity:进行最多20个问题的10题选择题游戏。

我需要一个快速的算法从一个通用列表中选择5个随机元素。例如,我想从一个List中获取5个随机元素。

0
0 Comments

Unity: 获取20个问题中最多10个问题的多选题游戏

在这篇文章中,我们将讨论如何在Unity中创建一个多选题游戏,并限定最多只能选择10个问题。我们将介绍一种名为“选择抽样”的技术来实现这个目标。

首先,我们需要遍历每个问题,并为每个问题设置选择的概率。概率的计算公式是:(所需数量)/(剩余数量)。例如,如果我们有40个问题,那么第一个问题被选中的概率为5/40。如果第一个问题被选中了,那么下一个问题的概率为4/39;否则,下一个问题的概率为5/39。通过这种方式,我们可以在到达最大数量之前选择出5个问题,并且通常在此之前就会选择出所有问题。

这种技术被称为“选择抽样”,它是“蓄水池抽样”的一种特殊情况。与打乱输入数据相比,这种技术的性能相似,但不需要修改原始数据就可以生成样本。

下面是一个实现这种技术的示例代码:

int maxQuestions = 10; // 最大问题数量
int remainingQuestions = 20; // 剩余问题数量
List allQuestions = 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个问题来创建多选题游戏。希望这篇文章对你有所帮助!

0
0 Comments

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类,我们可以确保获取到更可靠的随机数,从而保证游戏中的问题的随机性。

0
0 Comments

问题的出现原因:

在Unity中,有一个20个问题的问答游戏,需要从中随机选取10个问题。现在的问题是如何实现这个随机选取过程。

解决方法:

通过使用linq库中的OrderBy方法来实现随机选取。具体代码如下:

YourList.OrderBy(x => rnd.Next()).Take(10)

但是如果两个元素从rnd.Next()或类似的方法中获得相同的数值,那么第一个元素会被选中,而第二个元素可能不会被选中(如果不再需要更多的元素)。根据使用情况,这是足够随机的。

如果列表很小,代码简洁性是主要关注点,我会选择这种解决方法。但是如果这种方法会对整个列表进行枚举和排序,那么它的效率可能不高。

使用OrderBy方法只会对每个元素调用一次键选择器才能正常工作。如果OrderBy在比较两个元素时每次都调用键选择器,那么它会每次得到一个不同的值,从而破坏排序。文档中没有明确说明OrderBy的实现方式。

我的性能分析和日志显示,LINQ只对每个元素评估一次OrderBy表达式。如果以其他方式实现,昂贵的OrderBy表达式将会影响排序的性能。尽管契约没有保证这一点,但他们愚蠢到更改它。

需要注意的是,如果YourList中的元素很多,但只想选择其中几个,这种方法可能不太高效。

0