加倍游戏模拟

时间:2017-08-10 13:55:18

标签: c# algorithm statistics simulation probability

我想知道这个模拟器是否正常工作,因为我不认为这些是合乎逻辑的答案,但也不能捕捉到错误。

我为以下游戏编写了一个模拟器(给出了一副牌和1点)以找到最佳策略(什么是经销商最高卡继续游戏)

 1. Dealer picks a card and shows it to you(Dealer can't pick Joker)
 2. You decide whether to play or no
 3.1. If you don't play you get current points and finish game
 3.2. If you play you pick a Card
 3.2.1. If your card is higher you get double points and go back to step 1
 3.2.2. If your and dealer's cards are equal you go back to step 1
 3.2.3. If dealer's card is higher you lose all points and finish

模拟显示选择每张MAX卡的胜利系数。显示这些数字对我来说非常值得怀疑。我预计它会增长到1.5到7然后再回到1.

(首胜/模拟次数,Second-Max卡经销商可以为您继续游戏)

1 -1
1.0853817 0
1.1872532 1
1.3126581 2
1.4672619 3
1.6704736 4
1.9485809 5
2.2674231 6
2.9993735 7
3.5692085 8
4.3581477 9
4.0109722 10
2.3629856 11
0 12

这是C#代码:

using System;

namespace Codeforces
{
    class Program
    {
    static int[] k = new int[54];

    static Random rand = new Random();

    static long Doubling(int i, long f)
    {
        int d = rand.Next(52);

        if (k[d] > i) return f;

        int ch = d;
        while (ch == d) ch = rand.Next(54);

        if (k[d] > k[ch]) return 0;

        if (k[d] == k[ch]) return Doubling(i, f);

        return Doubling(i, f * 2);
    }

    static void Main(string[] args)
    {
        for (int i = 0; i < 54; i++) k[i] = i / 4;

        for (int i = -1; i < 13; i++)
        {
            long sum = 0;
            for (int j = 0; j < 1e7; j++)
            {
                sum += Doubling(i, 1);
            }

            Console.WriteLine(sum / 1.0e7 + " " + i);
        }
    }
}

}

1 个答案:

答案 0 :(得分:1)

我不是C#程序员,但看起来你的基本方法大多是正确的。我建议使用循环而不是递归。

你的问题描述对于小丑的价值以及经销商是否在抽签时丢弃笑话或者神奇地没有吸引他们而言是模糊的 - 如果我正确地阅读你的代码,你似乎已经选择了后者。

看起来你实现递归的方式隐含地在每次玩游戏后替换牌中的牌而不是在牌组中玩牌。

当我用另一种语言独立实现时,我得到了可比较的结果。在我看来,你的直觉是错误的。