📜  折断的棍子碎片形成侧面多边形的可能性

📅  最后修改于: 2021-06-25 10:26:35             🧑  作者: Mango

我们有一个长度为L的杆。该杆在(n-1)个随机选择的点处断裂(零件的长度也可以是非整数或浮点数),因此得到n个零件。我们需要找到这n个片段可以形成一个侧面多边形的可能性。
例子:

Input  : L = 5 n = 3
Output : 0.25
We need to cut rope of length 5
into three parts.

首先,我们需要找到n个长度可以形成边多边形的条件。让我们考虑一个三角形,我们知道一个三角形的最大边的长度必须小于其他边的长度之和。类似地,对于带边的多边形,最大边的长度必须小于其他(n-1)个边的总和。为什么?假设我们将棍子分成两等分。我们进一步将两半之一分成(n-1)个部分。我们永远不能将它们放置成闭合的多边形。 (实际上,我们能做的最好的就是制作两条平行线)。因此,我们只需要找到没有一个部分的长度大于或等于L / 2的概率。
现在我们需要研究概率。有许多方法可以使用几何方法来计算所需的概率。考虑周长L的圆。我们在周长上放置n个点。它们位于同一半圆上的概率为\frac{n}{2^{n-1}}   。请参考此链接以获取更多信息,让我们用P(E)表示它。
该概率实际上与折断棍棒以使至少一部分的长度为L / 2相同。但是我们只需要此事件的补充,因此我们的答案是P(E') = 1-P(E) = 1-\frac{n}{2^{n-1}}

C++
// CPP program to find probability that
// a rope of length L when broken into
// n parts form a polygon.
#include
 
using namespace std;
 
double printProbability(unsigned L, unsigned n)
{
   unsigned p = (1 << (n-1));
   return 1.0 - ((double)n) / ((double)p);
}
 
int main()
{
   unsigned n = 3, L = 5;
   cout << printProbability(L, n);
   return 0;
}


Java
// Java program to find probability that
// a rope of length L when broken into
// n parts form a polygon.
 
public class GFG {
     
 static double printProbability(int L, int n)
    {
       int p = (1 << (n-1));
       return 1.0 - ((double)n) / ((double)p);
    }
 
    // Driver code
    public static void main(String args[])
    {
         int n = 3, L = 5;
         System.out.println(printProbability(L, n));
            
    }
    // This Code is contributed by ANKITRAI1
}


Python3
# Python3 program to find probability that
# a rope of length L when broken into
# n parts form a polygon.
 
 
 
def printProbability(L, n):
 
    p = (1 << (n-1))
    return 1.0 - (float(n) / float(p) )
 
if __name__=='__main__':
    n = 3
    L = 5
    print(printProbability(L, n))
 
# this code is contributed by ash264


C#
// C# program to find probability 
// that a rope of length L when
// broken into n parts form a polygon.
using System;
 
class GFG
{
static double printProbability(int L, int n)
{
    int p = (1 << (n - 1));
    return 1.0 - ((double)n) /
                 ((double)p);
}
 
// Driver code
public static void Main()
{
    int n = 3, L = 5;
    Console.WriteLine(printProbability(L, n));
}
}
 
// This code is contributed
// by inder_verma


PHP


Javascript


输出:
0.25