从甲板上抽出一张卡片,进行蒙特卡洛扑克模拟

罗宾汉

目前,我正在开发一个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次)!
目前,整个过程都在变慢,我确实需要对其进行优化。我有一些想法:

  • 更快的随机数生成器
  • 将牌组(包括NSCard of PlayCards的Object-C类)和纸牌(Objective-C类)的整个高级表示形式更改为普通C-Arrays和结构体的表示形式
  • 将卡座和卡片的整体表示更改为按位级别,然后执行所有操作

你怎么认为?
你还有其他建议吗?
您知道更适合(更快)的随机数生成器吗?

提前致谢!

埃比·M·佩德森

通过随机查看循环中的整个平台

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档