从n个m边骰子中获取特定总和的概率c#

时间:2018-10-08 04:24:39

标签: c# math probability

我试图产生从n个骰子中获得特定数字的可能性,但不能保证它们的边数相同。 (例如1d6 + 2d10)

我知道有一种非常昂贵的方法(使用递归),但是如果有一种数学方法来确定事件发生的机会,那会更好。

3 个答案:

答案 0 :(得分:2)

一种方法:

  • 创建一个输出数组count,该数组的长度为sum(所有骰子都为1)+1,即可以滚动的最大值用作索引。
  • 这表示可以滚动索引的方式数量。初始化为[0] = 1。
  • 对于N个边的每个骰子,枚举每个可能的掷骰值的结果。
    • 将现有的count数组复制到prev中,然后创建一个新的空count数组
    • 对于roll = 1到N,对于total = 0进行计数。length-1-roll,count [total + roll] + = prev [total]
  • 现在滚动值的概率= count [value] / sum(count)

注意:

  • 这并不像您担心的那样昂贵,也不需要递归。这将是O(N ^ 2),其中N是所有骰子上的总数。
  • 这将计算所有输出的概率,而不仅仅是您感兴趣的一个输出,如果总面很大,而您感兴趣的值很小,这可能是一个问题。您可以将count数组的长度(感兴趣的值)加1,如果需要的话,并在处理过程中将总卷数计算为每个模面的乘积,而不是像我的sum(count) ve以上建议。

答案 1 :(得分:0)

@Rup已经给出了一种标准的解决方案,即自底向上的动态编程方法。

自上而下的方法是编写递归函数..然后memoize。就是说,在调用函数时,您首先要检查您以前是否看过(例如,您查看字典以了解是否对答案有“记忆”),如果没有,请计算答案并保存。然后返回记忆的答案。

通常需要权衡:

  1. 自上而下更容易弄清楚和编写。
  2. 从下至上,当您拥有3个骰子答案时,您无需存储2个骰子答案,因此减少了工作内存需求。

因此,最好了解这两种方法,但是我总是首先尝试一种自上而下的方法。

答案 2 :(得分:-2)

这是我从2个骰子滚动中产生的

将从n个面生成1个Randon()

这里2次n次滚动

对于n个已滚动显示3个总和

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dicerolling
{
    class Program
    {
        static void Main(string[] args)
        {

            Random x = new Random();
            int throw_times = 1;
            int sum = 0;
            int[] dice = new int[2];
            dice[0] = x.Next(1, 7);
            dice[1] = x.Next(1, 7);
            Console.WriteLine("enter the no of rollings :");
            var n = int.Parse(Console.ReadLine());
            for (int i = 1; i <= n; i++)
            {
                dice[0] = x.Next(1, 7);
                dice[1] = x.Next(1, 7);

                int total_var = dice[0] + dice[1];
                sum +=  dice[0] + dice[1] ;//total in array

                Console.Write("Throw " + throw_times + ": " + dice[0] + " d " + dice[1] + " = ");
                Console.WriteLine(total_var);
                throw_times++;

                Array.Sort(dice);

                for (int a = dice.Length - 1; a >= 0; a--)
                {
                    int s = dice[a];
                    Console.WriteLine("#" + s);
                }
            }

            Console.WriteLine("Total sum: " + sum);//only returns sum of last 2 rolls


            Console.ReadLine();
        }
    }
}