C# 拣选时是洗牌数组还是随机化索引?

C# 拣选时是洗牌数组还是随机化索引?,c#,unity3d,C#,Unity3d,我有一堆扑克牌(列表),当玩家点击这堆扑克牌时,我想随机挑选牌 要创建“随机卡”体验,我考虑两种方法: 在初始化过程中,通过对列表重新排序来洗牌牌,然后在静态索引处拾取第一张牌[0] 保持堆栈不变,并使用cards[随机范围(0,cards.Count)]选择一张卡 (在这两种情况下,拾取卡片也会将其从列表中删除。) 这两种方法之间是否存在任何相关差异(统计上或其他方面)、缺点/优势等,或者它们本质上是相同的?这里有两种方法:随机挑选和随机洗牌 随机挑选包括拿一张有序的牌组,挑选一张随机的牌

我有一堆扑克牌(
列表
),当玩家点击这堆扑克牌时,我想随机挑选牌

要创建“随机卡”体验,我考虑两种方法:

  • 在初始化过程中,通过对列表重新排序来洗牌牌,然后在静态索引处拾取第一张牌
    [0]
  • 保持堆栈不变,并使用
    cards[随机范围(0,cards.Count)]
    选择一张卡
(在这两种情况下,拾取卡片也会将其从列表中删除。)


这两种方法之间是否存在任何相关差异(统计上或其他方面)、缺点/优势等,或者它们本质上是相同的?

这里有两种方法:随机挑选和随机洗牌

随机挑选包括拿一张有序的牌组,挑选一张随机的牌,然后从牌组中抽出那张牌

洗牌包括取一张有序的牌组,随机挑选一张牌,然后将该牌放在新牌组的顶部,然后直接从中抽牌

在这两种情况下,您最多需要进行N-1次随机数调用,其中N是牌组中的牌数(当只有一张牌时,您不需要调用RNG)。然而,在随机选取的情况下,您不必一次完成所有随机调用,而且不仅如此,您甚至不必调用随机函数N-1次。如果你最后只抽了前10张牌,那就只有10个随机电话了。此外,如果你需要重新排列牌组,你可以将牌组重新添加到牌组中,然后再重新随机挑选

从算法效率的角度来看,随机选择显然是更优的选择

无论如何都要洗牌。

事情是这样的:你不是想从序列中随机挑选一个项目,而是想洗牌一副牌。使用与您的设计相匹配的抽象,并且只有在需要时才偏离它。见鬼,我几乎建议使用
堆栈
而不是
列表
,因为它与一副牌的基本结构匹配得更好一些。但是,如果你计划大量操纵甲板,列表可能会更好地为你服务


也可以这样考虑:随机选取假设你的整个甲板被拖曳。您可能并不总是希望整个牌组被洗牌。你可能想要明确地把卡片放在顶部或底部或者在你的甲板中间。如果你想巧妙地运用算法,那么做这些事情就要困难得多。

请用这段代码为数组项随机值选取一个新的随机值

        private void BtnRandomIndex_Click(object sender, EventArgs e)
    {
        int[] Arr = new int[5];

        for (int i = 0; i <= 4; i++)
            Arr[i] = i * 10 ;

        Random Rnd=new Random();
        MessageBox.Show(Rnd.Next((Arr.Length)).ToString());
    }
private void BtnRandomIndex\u单击(对象发送方,事件参数e)
{
int[]Arr=新的int[5];

对于(int i=0;我看到了几分钟前的答案:第二种方法必须测试,以确保您不会两次拾取同一张卡或从列表中删除该卡。@jdweng但他说(在这两种情况下,拾取一张卡也会从列表中删除)。因此,无需重新洗牌,第二种方法就足以进行此类操作。您列出的两个选项实际上是同一件事。选择一张具有统一问题的牌并将其移除,直到没有剩余为止,这是一次统一的洗牌。