目前,我正在开发一个iOS应用程序,在该应用程序中,我需要从Carddeck抽取随机卡片。目前,我的代码如下所示:
- (PlayingCard*) drawRandomCard
{
PlayingCard * randomCard = nil;
NSUInteger index = arc4random_uniform(self.cards.count);
randomCard = self.cards[index]; //self.cards is an NSArray of PlayingCard's
while (randomCard.isUsed) {
index = arc4random_uniform(self.cards.count);
randomCard = self.cards[index];
}
randomCard.used = YES;
return randomCard;
}
这种方法被称为很多方法(一次蒙特卡洛模拟要进行50'000-1'000'000次)!
目前,整个过程都在变慢,我确实需要对其进行优化。我有一些想法:
你怎么认为?
你还有其他建议吗?
您知道更适合(更快)的随机数生成器吗?
提前致谢!
通过随机查看循环中的整个平台
while (randomCard.isUsed) {
而且不仅是那些还在使用中的游戏,到达甲板的尽头还会有很多重试。最后一张卡(52号)的空缺率> 25。在整个甲板上走动平均会造成600多次未命中。
除此以外,您还需要重置卡座,然后才能再次使用它。我猜您有一个方法可以通过遍历所有卡并执行来重置卡片组used = NO
。这使52个操作甲板上,即使你只需要处理一张卡。
通过这种简单的解决方案,您可以避免这两个问题。
将所有卡存储在一个阵列中。然后,将一端专用于尚未发牌,另一端专用于已发牌:
<---------------------- not yet dealt ---------------------->
[ ah 2h 3h 4h 5h 6h 7h 8h 9h 10h jh qh kh ad 2d ..... jk qk kk ]
^
dealt
cards
在尚未发出的牌范围内随机选择一张牌(7小时):
[ ah 2h 3h 4h 5h 6h 7h 8h 9h 10h jh qh kh ad 2d ..... jk qk kk ]
^^
切换到尚未发行的最后一张卡片,然后将已发行的卡片指针移到左侧。
<-------------------- not yet dealt --------------------->
[ ah 2h 3h 4h 5h 6h kk 8h 9h 10h jh qh kh ad 2d ..... jk qk 7h ]
^
dealt
cards
重复所需的时间:
<------------------ not yet dealt ----------------->
[ ah 2h qk 4h 5h 6h kk 8h 9h 10h jh jk kh ad 2d ..... qh 3h 7h ]
^
dealt
cards
当您需要新卡座时,只需将发牌指针移回末尾即可,卡座已准备好进行新的使用。
<----------------------- not yet dealt ---------------------->
[ ah 2h qk 4h 5h 6h kk 8h 9h 10h jh jk kh ad 2d ..... qh 3h 7h ]
^
dealt
cards
牌组的新顺序只会增加随机性...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句