📜  断棒的碎片形成边多边形的概率

📅  最后修改于: 2021-10-23 08:08:41             🧑  作者: 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) 个部分。我们永远不能将它们放置成一个封闭的多边形。 (实际上我们能做的最好的事情就是做2条平行线)。所以我们只需要找到没有部分长度大于或等于 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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程