有人问起:袋中有1到10号的球各一个,任意取出三球,求三球中任二球均不连号的机率?邀月今天抽空试了一下。算法很一般。期待交流。
大概的算法是三层循环,先任意取出一个球,再从剩余球里再取出任意一个,再******。
/// <summary>
/// 袋中N个号码不同的球,任意取出三球,求三球中任二球均不连号的机率
/// By tony 200909.17
/// <a title="邀月工作室" href="http://blog.youkuaiyun.com/downmoon/" mce_href="http://blog.youkuaiyun.com/downmoon/" >欢迎与邀月交流,net技术与软件架构</a>(邀月)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();
}
/// <summary>
/// 比较是否相邻
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
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);
}
测试结果:
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);
}
三球中任二球不连号的可能性有:420
种!
三球取出的全部可能性有:720种!
三球中任二球均不连号的机率为:0.525