C#老虎机获奖算法

时间:2018-08-29 12:40:33

标签: c# .net algorithm

我正在尝试对老虎机进行编程。

我有5个滚筒和7张获奖照片。看起来像

-----|-----|-----|-----|----|

-----|-----|-----|-----|----|

-----|-----|-----|-----|----|

我每卷得到3张照片。

foreach (var s in Walze1)
        {
            Random rnd = new Random();
            int perCent = rnd.Next(Walze1dot7, 110);

            //10 % Chance auf 7 per Walze
            if (perCent <= 10)
            {
                Walze1dot7 = 11;
                s.Text = "7";
            }
            //10 % Chance auf Glocke per Walze
            else if (perCent <= 20 & perCent > 10)
            {
                s.Text = "Glocke";
            }
            //15 % Chance auf Melone
            else if (perCent <= 35 & perCent > 20)
            {
                s.Text = "Melone";
            }
            //15 % Chance auf Pflaume
            else if (perCent <= 35 & perCent > 50)
            {
                s.Text = "Pflaume";
            }
            //20 % Chance auf Orange
            else if (perCent <= 70 & perCent > 50)
            {
                s.Text = "Orange";
            }
            //20 % Chance auf Zitrone
            else if (perCent <= 90 & perCent > 70)
            {
                s.Text = "Zitrone";
            }
            //20 % Chance auf Kirche
            else if (perCent <= 110 & perCent > 90)
            {
                s.Text = "Kirche";
            }
        }

在一个滚筒上只能有一个7。

我的问题:

我赢了太多……随机代码经常给我带来成功的画面(一行至少要有3张相同的画面)。

那我该如何更改我会更频繁地松散的代码?

编辑

这不是重复的,因为我知道如何生成一个随机数...我需要的是我不经常获得获奖图片(每行3张)...

让我们说我以每次点击2欧元获得100欧元。点击50次后,我总获得的金额超过300欧元。

1 个答案:

答案 0 :(得分:0)

在if语句中使用(按位与)&而不是(逻辑与)&&是一个问题,但这不是主要问题。您也不应该每次调用此函数时都生成一个新的Random()-这是一项昂贵的操作,经常运行它会降低您的速度。

您说您已测试过,但未测试随机性。当您生成随机事件时,应编写一个测试用例,以查看它们实际是多么随机。在特定情况下,您可以创建一个Dictionay<string,int>并将其初始化为每个可以随机选择的字符串,然后在每次生成该字符串时对其加1。

static Dictionary<string,int> CountUses = new Dictionary<string, int>();

  /* do this once  - so they always print in order*/
        CountUses.Add("", 0);
        CountUses.Add("7", 0);
        CountUses.Add("Glocke", 0);
        CountUses.Add("Melone", 0);
        CountUses.Add("Pflaume", 0);
        CountUses.Add("Orange", 0);
        CountUses.Add("Zitrone", 0);
        CountUses.Add("Kirche", 0);

/* use this in your function */
if (!CountUses.ContainsKey(s.Text))
     CountUses.Add(s.Text, 0);

 CountUses[s.Text]++;

然后调用您的函数10,000,000次,看看数字是什么样的-它们应该相当接近。

    for ( int x = 1; x < 10000000; ++x)
        tester(); //function I made to call your code

    foreach (var key in CountUses.Keys)
            Console.WriteLine(String.Format("{0,10} uses of {1,8} = {2:P}", CountUses[key], key, CountUses[key]/ 10000000.0f));

使用您的代码,结果分布不均,有时为空:

   1376943 uses of          = 13.77%
    998104 uses of        7 = 9.98%
    937056 uses of   Glocke = 9.37%
   1358398 uses of   Melone = 13.58%
         0 uses of  Pflaume = 0.00%
   1814880 uses of   Orange = 18.15%
   1788699 uses of  Zitrone = 17.89%
   1725919 uses of   Kirche = 17.26%

用&&替换&是不同的,但仍然不正确(足够接近以致于随机差异):

   1358963 uses of          = 13.59%
   1013747 uses of        7 = 10.14%
    891739 uses of   Glocke = 8.92%
   1382211 uses of   Melone = 13.82%
         0 uses of  Pflaume = 0.00%
   1818295 uses of   Orange = 18.18%
   1825153 uses of  Zitrone = 18.25%
   1709891 uses of   Kirche = 17.10%

使用测试代码,可以很容易地找到最大的错误,然后查看所获得的百分比是否确实是您期望的百分比。