园子里有人问起:袋中有1到10号的球各一个,任意取出三球,求三球中任二球均不连号的机率?邀月今天抽空试了一下。算法很一般。期待交流。
园子里有人问起:袋中有1到10号的球各一个,任意取出三球,求三球中任二球均不连号的机率?邀月今天抽空试了一下。算法很一般。期待交流。
大概的算法是三层循环,先任意取出一个球,再从剩余球里再取出任意一个,再******。
Code
/**//// <summary>
/// 袋中N个号码不同的球,任意取出三球,求三球中任二球均不连号的机率
/// By tony 200909.17
/// downmoon(邀月)3w@live.cn
/// </summary>
/// <param name="orgInt">一个整形数组列</param>
public static void GetProbability(int[] orgInt)
{
int length = orgInt.Length;
int all = 0;//所有的总数
int rel = 0;//相邻的总数
foreach (int fi in orgInt)
{
//从Length个号码数组中任意取出一球,号码为fi
int[] secInt = new int[length - 1];
//得到剩余的九个号码数组
int[] temp1 = new int[orgInt.Length];
temp1 = (int[])orgInt.Clone();
int t1 = 0;
foreach (int r1 in temp1)
{
if (fi != r1)
{
secInt[t1] = r1;
t1++;
}
}
int[] thInt = new int[secInt.Length - 1];
foreach (int si in secInt)
{
//从剩余的length-1个号码数组中任意取出一球,号码为si
//得到剩余的八个号码数组
//Console.WriteLine(fi + "+" + si + "+" );
int[] temp2 = (int[])secInt.Clone();
int t2 = 0;
foreach (int r2 in temp2)
{
if (si != r2 && r2 != fi)
{
thInt[t2] = r2;
t2++;
}
}
foreach (int ti in thInt)
{
//从剩余的length-2个号码数组中任意取出一球,号码为ti
if ((!isRel(ti, si)) && (!isRel(fi, si)) && (!isRel(fi, ti)))
{
rel++;
Console.WriteLine(fi + "+" + si + "+" + ti);
}
//此处可以外部计算获得,以节约资源
//all++;
}
}
}
all = length * (length - 1) * (length - 2);
Console.WriteLine("三球中任二球不连号的可能性有:" + rel + "种!");
Console.WriteLine("三球取出的全部可能性有:" + all + "种!");
Console.WriteLine("三球中任二球均不连号的机率为:" + ((double)rel / all).ToString());
Console.ReadKey();
}
public static bool isRel(int a, int b)
{
if ((a + 1) == b) { return true; }
if ((a - 1) == b) { return true; }
return false;
}
测试 :
public static void Main(string[] args)
{
int[] OrgInt = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
GetProbability(OrgInt);
}
测试结果:
Code
1+10+7
1+10+8
2+4+6
2+4+7
2+4+8
2+4+9
2+4+10
2+5+7
2+5+8
2+5+9
2+5+10
2+6+4
2+6+8
2+6+9
2+6+10
2+7+4
2+7+5
2+7+9
2+7+10
2+8+4
2+8+5
2+8+6
2+8+10
2+9+4
2+9+5
2+9+6
2+9+7
2+10+4
2+10+5
2+10+6
2+10+7
2+10+8
3+1+5
3+1+6
3+1+7
3+1+8
3+1+9
3+1+10
3+5+1
3+5+7
3+5+8
3+5+9
3+5+10
3+6+1
3+6+8
3+6+9
3+6+10
3+7+1
3+7+5
3+7+9
3+7+10
3+8+1
3+8+5
3+8+6
3+8+10
3+9+1
3+9+5
3+9+6
3+9+7
3+10+1
3+10+5
3+10+6
3+10+7
3+10+8
4+1+6
4+1+7
4+1+8
4+1+9
4+1+10
4+2+6
4+2+7
4+2+8
4+2+9
4+2+10
4+6+1
4+6+2
4+6+8
4+6+9
4+6+10
4+7+1
4+7+2
4+7+9
4+7+10
4+8+1
4+8+2
4+8+6
4+8+10
4+9+1
4+9+2
4+9+6
4+9+7
4+10+1
4+10+2
4+10+6
4+10+7
4+10+8
5+1+3
5+1+7
5+1+8
5+1+9
5+1+10
5+2+7
5+2+8
5+2+9
5+2+10
5+3+1
5+3+7
5+3+8
5+3+9
5+3+10
5+7+1
5+7+2
5+7+3
5+7+9
5+7+10
5+8+1
5+8+2
5+8+3
5+8+10
5+9+1
5+9+2
5+9+3
5+9+7
5+10+1
5+10+2
5+10+3
5+10+7
5+10+8
6+1+3
6+1+4
6+1+8
6+1+9
6+1+10
6+2+4
6+2+8
6+2+9
6+2+10
6+3+1
6+3+8
6+3+9
6+3+10
6+4+1
6+4+2
6+4+8
6+4+9
6+4+10
6+8+1
6+8+2
6+8+3
6+8+4
6+8+10
6+9+1
6+9+2
6+9+3
6+9+4
6+10+1
6+10+2
6+10+3
6+10+4
6+10+8
7+1+3
7+1+4
7+1+5
7+1+9
7+1+10
7+2+4
7+2+5
7+2+9
7+2+10
7+3+1
7+3+5
7+3+9
7+3+10
7+4+1
7+4+2
7+4+9
7+4+10
7+5+1
7+5+2
7+5+3
7+5+9
7+5+10
7+9+1
7+9+2
7+9+3
7+9+4
7+9+5
7+10+1
7+10+2
7+10+3
7+10+4
7+10+5
8+1+3
8+1+4
8+1+5
8+1+6
8+1+10
8+2+4
8+2+5
8+2+6
8+2+10
8+3+1
8+3+5
8+3+6
8+3+10
8+4+1
8+4+2
8+4+6
8+4+10
8+5+1
8+5+2
8+5+3
8+5+10
8+6+1
8+6+2
8+6+3
8+6+4
8+6+10
8+10+1
8+10+2
8+10+3
8+10+4
8+10+5
8+10+6
9+1+3
9+1+4
9+1+5
9+1+6
9+1+7
9+2+4
9+2+5
9+2+6
9+2+7
9+3+1
9+3+5
9+3+6
9+3+7
9+4+1
9+4+2
9+4+6
9+4+7
9+5+1
9+5+2
9+5+3
9+5+7
9+6+1
9+6+2
9+6+3
9+6+4
9+7+1
9+7+2
9+7+3
9+7+4
9+7+5
10+1+3
10+1+4
10+1+5
10+1+6
10+1+7
10+1+8
10+2+4
10+2+5
10+2+6
10+2+7
10+2+8
10+3+1
10+3+5
10+3+6
10+3+7
10+3+8
10+4+1
10+4+2
10+4+6
10+4+7
10+4+8
10+5+1
10+5+2
10+5+3
10+5+7
10+5+8
10+6+1
10+6+2
10+6+3
10+6+4
10+6+8
10+7+1
10+7+2
10+7+3
10+7+4
10+7+5
10+8+1
10+8+2
10+8+3
10+8+4
10+8+5
10+8+6
三球中任二球不连号的可能性有:336种!
三球取出的全部可能性有:720种!
三球中任二球均不连号的机率为:0.466666666666667
欢迎指正。
说明:
文章开头说的是1-10号球是连号的。而本文的算法中是不区分号码的具体的数字, 也就是说,算法是通用的,跟具体的数字没有关系。
可以测试:
public static void Main(string[] args)
{
int[] OrgInt = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11 };
GetProbability(OrgInt);
}
把原数字10改为11,则答案变成
三球中任二球不连号的可能性有:378 种!
三球取出的全部可能性有:720种!
三球中任二球均不连号的机率为:0.525
public static void Main(string[] args)
{
int[] OrgInt = { 1, 2, 3, 4, 5, 6, 7, 8, 13, 11 };
GetProbability(OrgInt);
}
把原数字10改为11,把原数字9改为13,则答案变成
三球中任二球不连号的可能性有:420 种!
三球取出的全部可能性有:720种!
三球中任二球均不连号的机率为:0.525