在采摘时随机播放数组或随机化索引?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在采摘时随机播放数组或随机化索引?相关的知识,希望对你有一定的参考价值。

我有一堆扑克牌(List<Card>),我想在玩家点击堆叠时随机挑选牌。

要创建“随机卡”体验,我想到两种方式:

  • 通过在初始化期间重新排序列表来随机播放卡片的位置,然后在静态索引[0]处选择第一张卡片。
  • 保持堆栈不变,并使用cards[Random.Range(0,cards.Count)]选择卡

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

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

答案

这里有两种方法:Random Pick和Shuffle。

随机选择涉及采取有序的牌组,挑选一张随机牌,并从牌组中抽出该牌。

Shuffle涉及采取有序的牌组,挑选随机牌,并将该牌放在新牌组的顶部,然后您将从中直接抽牌。

在这两种情况下,您最多需要进行N-1个随机数呼叫,其中N是卡组中的卡数(当只有一个卡时,您不需要呼叫RNG)。但是在随机选择的情况下,你不必一次完成所有随机调用,不仅如此,你甚至不必调用随机函数N-1次。如果你最终只能抽出前十张牌,那么这只是10次随机调用。此外,如果您需要重新洗牌,您可以将卡片添加回卡座,然后随意返回。

从算法效率的角度来看,Random Pick是明显的优越选择。

无论如何洗牌。

事情就是这样:你不是试图从一个序列中挑选一个随机项目,而是试图改变一副牌。使用与您的设计相匹配的抽象,并在您需要时偏离该抽象。地狱,我几乎建议使用Stack而不是List,因为它最好地匹配一副牌的基本结构稍微好一些。但如果你计划操纵甲板很多,列表可能会更好。

另外,请考虑这一点:随机选择假定您的整个牌组被洗牌。您可能并不总是希望整个牌组被洗牌。您可能希望明确将卡放在卡组的顶部或底部或中间。如果你试图通过算法变得聪明,那么做这些事情会更加困难。

另一答案

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

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

我希望这可以帮助^ _ ^

以上是关于在采摘时随机播放数组或随机化索引?的主要内容,如果未能解决你的问题,请参考以下文章

播放随机声音而不重复

调用时不播放随机音频列表

VBA - 如何使随机化字符串数组工作?

试图随机化一个数组,但每次都保持相同的随机化[重复]

从我的数组列表中播放随机歌曲时出现异常

随机化在计算机中的应用:查找和搜索以及信息加密