数学函数计算概率

4
我正在处理一种数学函数,需要检查两个列表中哪一个更大且不能再被超越。我已经花了相当长的时间在这上面,但我无法得到正确的结果,代码变得对我来说越来越复杂。我认为可能有某种公式可以使我的生活更轻松,但我找不到它,我害怕数学不是我的强项。
这是我想做的:
我有两个列表,每隔一步都会添加值0或1。因此,第1步将0或1添加到List1,第2步将0或1添加到List2。
在进行6步后,该函数必须停止并检查List1内是否有更多的1还是List2内是否有更多的1,或者它们相等。
但是,例如,在第4步时,如果List1内有两个1,而List2内有两个0,则函数应该停止并显示List1,因为List2永远无法超过或等于List1。
另一个例子: 如果在第5步中,List1有1个1和2个0,而List2有2个1,则该函数应该停止,因为这已经不重要了,因为List2比List1有更多的1。
但我似乎无法解决这个谜题。有没有人能够解决这个问题?
private void button1_Click(object sender, EventArgs e)
{
    resetLists();
}

private void button2_Click(object sender, EventArgs e)
{
    nextStep();
}

public Random rnd = new Random();
public List<int> List1 = new List<int>();
public List<int> List2 = new List<int>();
public int step = 0;

private void resetLists()
{
    List1.Clear();
    List2.Clear();
    step = 0;
    Console.WriteLine("----------------------------");
}

private void nextStep()
{
    step++;

    if (step <= 6)
    {
        if (step % 2 != 0)
        {
            int result = rnd.Next(0, 2);
            List1.Add(result);
            Console.WriteLine("List 1: " + result.ToString());
        }
        else
        {
            int result = rnd.Next(0, 2);
            List2.Add(result);
            Console.WriteLine("List 2: " + result.ToString());
        }

        if (step > 3)
        {
            checkLists();
        }
    }
}

private void checkLists()
{
    int actualResultList1 = 0;
    int actualResultList2 = 0;
    int virtualResultList1 = 0;
    int virtualResultList2 = 0;

    // GET THE ONES FROM LIST 1
    for (int l1 = 0; l1 < List1.Count; l1++)
    {
        if (List1[l1] == 1)
        {
            actualResultList1++;
        }
    }

    // GET THE ONES FROM LIST 2
    for (int l2 = 0; l2 < List2.Count; l2++)
    {
        if (List2[l2] == 1)
        {
            actualResultList2++;
        }
    }

    // CALCULUATE THE VIRTUAL ONES
    virtualResultList1 = 3 - List1.Count;
    virtualResultList2 = 3 - List2.Count;

    if (step < 6)
    {
        if ((actualResultList1 + virtualResultList1) >= (actualResultList2 + virtualResultList2) + (6-step))
        {
            MessageBox.Show("List1");
        }

        if ((actualResultList2 + virtualResultList2) >= (actualResultList1 + virtualResultList1) + (6-step))
        {
            MessageBox.Show("List2");
        }
    }
    else
    {
        if (actualResultList1 > actualResultList2)
        {
            MessageBox.Show("List1");
        }
        else if (actualResultList2 > actualResultList1)
        {
            MessageBox.Show("List2");
        }
        else if (actualResultList1 == actualResultList2)
        {
            MessageBox.Show("equal");
        }
    }
}

1
由于您正在添加10来计算1,因此您可以简单地使用List1.Sum()来计算。关于提前停止的问题涉及到“x个中最好”与“前x个”的区别。如果您运行6步,则有一个“6个中最好”的情况。要将“n个中最好”转换为“前n个”,可以运行:(n + 1)/2。并比较它是否大于或等于。如果您有6个步骤,则可以在任一列表的计数为> =(6 + 1)/ 2时停止(在这种情况下为3.5,因此4符合此条件)。 - Rob
1
抱歉,我误读了 - 要检测是否可以提前退出,每个列表之间的差异必须大于剩余步数。例如:Math.Abs(List1.Count() - List2.Count()) > (numSteps - currentStep) 将告诉您是否有任何一个列表已经获胜。但是,您关于“for循环步骤”的示例不起作用 - List1 可以获得两个 1,List2 可以获得两个 0,并且它们都将在第6步结束时达到2。 - Rob
Step4是最早的退出点:如果List1有2个1,而List2在那一点得到它的第二个0,那么List2将永远无法再次平衡,因为每个列表只剩下一个步骤。 - Cainnech
我正在尝试,但无法使它正常工作……我做错了什么?if (Math.Abs(actualResultList1 - actualResultList2) > ((6 - step)/2)) { MessageBox.Show("List1"); } 在第4步中,当List2有2个"1",List1有2个"0"时,应该退出,但在这种情况下,等式左边有2个,右边有3个。 - Cainnech
你得到了什么错误? - Rob
显示剩余8条评论
1个回答

2

由于Rob提供的巨大帮助,我成功解决了问题。

最终解决方案:

private void checkLists()
{
int actualResultList1 = 0;
int actualResultList2 = 0;

// GET THE ONES FROM LIST 1
for (int l1 = 0; l1 < List1.Count; l1++)
{
    if (List1[l1] == 1)
    {
        actualResultList1++;
    }
}

// GET THE ONES FROM LIST 2
for (int l2 = 0; l2 < List2.Count; l2++)
{
    if (List2[l2] == 1)
    {
        actualResultList2++;
    }
}

if ((List1.Count + List2.Count) < 6)
{
    if (actualResultList1 > (actualResultList2 + ((6/2) - List2.Count)))
    {
        MessageBox.Show("List1");
    }

    if (actualResultList2 > (actualResultList1 + ((6/2) - List1.Count)))
    {
        MessageBox.Show("List2");
    }
}
else
{
    if (actualResultList1 > actualResultList2)
    {
        MessageBox.Show("List1");
    }
    else if (actualResultList2 > actualResultList1)
    {
        MessageBox.Show("List2");
    }
    else if (actualResultList1 == actualResultList2)
    {
        MessageBox.Show("equal");
    }
}
}

如果未来有人也在寻找这个问题的答案,那么这里就是答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接