我试图产生从n个骰子中获得特定数字的可能性,但不能保证它们的边数相同。 (例如1d6 + 2d10)
我知道有一种非常昂贵的方法(使用递归),但是如果有一种数学方法来确定事件发生的机会,那会更好。
答案 0 :(得分:2)
一种方法:
count
,该数组的长度为sum(所有骰子都为1)+1,即可以滚动的最大值用作索引。注意:
答案 1 :(得分:0)
@Rup已经给出了一种标准的解决方案,即自底向上的动态编程方法。
自上而下的方法是编写递归函数..然后memoize。就是说,在调用函数时,您首先要检查您以前是否看过(例如,您查看字典以了解是否对答案有“记忆”),如果没有,请计算答案并保存。然后返回记忆的答案。
通常需要权衡:
因此,最好了解这两种方法,但是我总是首先尝试一种自上而下的方法。
答案 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();
}
}
}