随机排列数组还是在挑选时随机化索引?

时间:2019-04-13 13:47:50

标签: c# unity3d

我有一堆扑克牌(List<Card>),当玩家单击该牌堆时,我想在其中随机挑选纸牌。

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

  • 通过在初始化过程中对列表进行重新排序来随机排列卡的位置,然后只需在静态索引[0]处选择第一张卡即可。
  • 保持堆叠不变,并使用cards[Random.Range(0,cards.Count)]选择一张牌

(在两种情况下,拾取卡片也会将其从列表中删除。)

这两种方法之间是否存在任何相关的差异(无论是统计上还是其他方面),优缺点等等?或者

2 个答案:

答案 0 :(得分:0)

这里有两种方法:随机选择和随机播放。

随机挑选包括获得有序的牌组,挑选一张随机卡并从牌组中抽取该卡。

随机播放涉及获得一个有序的牌组,随机选择一张牌,然后将该牌放到 new 牌组的顶部,然后直接从中抽取牌。

在这两种情况下,您最多都需要进行N-1个随机号码呼叫,其中N是卡组中的卡片数量(当只有一张卡片时,您不需要呼叫RNG )。但是,在“随机选择”情况下,您不必一次全部执行这些随机调用,不仅如此,您甚至不必调用N-1次Random函数。如果最终只抽出前10张卡,那将是10次随机通话。另外,如果您需要重新洗牌,您可以将卡片重新添加到牌中,然后再随机选择。

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

还是随机播放卡组。

这就是问题:您不是在尝试从序列中选择随机项目,而是在尝试随机播放一副纸牌。使用与您的设计相匹配的抽象,并且仅在需要时才与抽象有所不同。地狱,我几乎建议您使用Stack而不是List,因为它最能与纸牌的基本结构更好地匹配。但是,如果您打算大量操作甲板,则列表可能会更好。

此外,请考虑以下问题:随机挑选假设您的整个牌堆都被洗了。您可能不总是想要整个牌组都需要洗牌。您可能需要明确地将卡片放置在卡座的顶部或底部或中间。如果您想更聪明地使用算法,那么做这些事情将变得更加困难。

答案 1 :(得分:-1)

请使用此代码为数组项随机值选择一个新的随机值。

        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());
    }

我希望这可以帮助^ _ ^