#region n个骰子的点数
/// <summary>
/// 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出所有可能的值出现的概率。
/// </summary>
class Dice
{
private int g_maxValue=6;
private int _number;
public int number
{
get { return _number; }
set { _number = value; }
}
public Dice(int n)
{
number = n;
}
/// <summary>
///Solution1 使用递归的方式,但是时间效率不高
/// </summary>
public void PrintProbability()
{
if (number < 1)
return;
int maxSum = number * g_maxValue;
List<int> pProbility = new List<int>();
for (int i = 0; i < maxSum - number+1; i++)
pProbility.Add(0);
Probility(number, pProbility);
double total = Math.Pow(g_maxValue,number);
for (int i = 0; i < maxSum - number+1; i++)
{
double ratio = (double)pProbility[i] / total;
Console.WriteLine("{0}:{1}",i+number,ratio);
}
}
public void Probility(int num,List<int> pProbility)
{
for (int i = 1; i <= g_maxValue; i++)
{
Probility(num, num, i, pProbility);
}
}
public void Probility(int original,int current, int sum, List<int> pProbility)
{
if (current == 1)
pProbility[sum - original]++;
else
{
for(int i=1;i<=g_maxValue;i++)
Probility(original, current - 1, i + sum, pProbility);
}
}
/// <summary>
///Solution1 使用循环的方式,但是时间效率较高
/// </summary>
public void PrintProbabilitySolution2()
{
if (number < 1)
return;
List<List<int>> pProbilities = new List<List<int>>(){new List<int>(),new List<int>()};
for (int i = 0; i < g_maxValue * number + 1; ++i)
{
pProbilities[0].Add(0);
pProbilities[1].Add(0);
}
int flag = 0;
for (int i = 1; i <= g_maxValue; ++i)//记录的是第一个骰子每个总数出现的次数,从1到6个点数,各出现一次。
pProbilities[flag][i] = 1;
for (int k = 2; k <= number; ++k)//控制k的开始,k从2开始,也就是说骰子数大于2,否则,不用计算
{
for (int i = 0; i < k; ++i)
pProbilities[1 - flag][i] = 0;
for (int i = k; i <= g_maxValue * k; ++i)
{
pProbilities[1 - flag][i] = 0;
//f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)+f(n-6),均是上次循环的相差1,2,3,4,5,6的次数
for (int j = 1; j <= i && j <= g_maxValue; ++j)
pProbilities[1 - flag][i] += pProbilities[flag][i - j];
}
flag = 1 - flag;//flag用于切换数组
}
double total = Math.Pow(g_maxValue, number);
for (int i = 0; i < g_maxValue * number+1; i++)
{
double ratio = (double)pProbilities[flag][i] / total;
Console.WriteLine("{0}:{1}", i, ratio);
}
}
}
#endregion