在采摘时随机播放数组或随机化索引?
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());
}
我希望这可以帮助^ _ ^
以上是关于在采摘时随机播放数组或随机化索引?的主要内容,如果未能解决你的问题,请参考以下文章