2017-07-17 18 views
-2

いいえ、スティックがランダムに3つの部分にランダムに分割されたとき(ランダムに独立して選択される)、三角形が形成される確率を与えるコードが書かれています。四角形のための三角形のプログラムを変更する方法

スティックを5つに分割し、プログラムが四角形を形成する確率を見つけるようにコードを変更しようとしています。誰かがコードを変更して5つのケースと四角形のケースで動作させる方法を見ていますか?

元のコードはC#で、以下に示します。

ありがとうございました!

C#コード:

private static Random s_Random = new Random(); 

private static bool TestForTriangle() { 
    double x1 = s_Random.NextDouble(); 
    double x2 = s_Random.NextDouble(); 

    double a, b, c; 

    if (x1 < x2) { 
    a = x1; 
    b = x2 - x1; 
    c = 1.0 - x2; 
    } 
    else { 
    a = x2; 
    b = x1 - x2; 
    c = 1.0 - x1; 
    } 

    return (a < b + c) && (b < a + c) && (c < a + b); 
} 

...

int n = 1000000; 

double success = 0.0; 

for (int i = 0; i < n; ++i) 
    if (TestForTriangle()) 
    success += 1.0; 

double probability = success/n; 

Console.Write(probability); 
+2

ようこそ[ように]。 [尋ねる]を見直し、あなたが試したことをお見せしてください。これは宿題のように見え、宿題のサービスではありません。 – TemporalWolf

+0

四辺形をテストする方法、または少なくとも四角形を決定するための数式はすでにありますか?それはまず答える必要があります。また、四辺形は5ではなく4辺を持ちます。 –

+1

ちょっと、TemporalWolf。宿題ではありません。 –

答えて

1

私はあなたが一般的な方法でこれを解決するために必要なものだと思うあなたの式は、より汎用的にすることです。

三角形については、任意の辺の合計が3番目の辺よりも大きいことを確認しています。しかし、実際に考えているのであれば、実際に行う必要があるのは、の長辺が他の2つの合計よりも小さいことを確認することです。そのケースが真であれば、他のすべてのケースも真である。

この規則は、四角形またはその他の図形にも適用されます。基本的には、最長の寝台を置いて一方の端にチェーンの一端を取り付け、チェーンの端が長い辺のもう一方の端に達するようにします。しかし

return (maxValue < sumOfOtherValues); 

、あなたは私たちがしているオブジェクトのそれよりも側面の数より大きなをできるようにしたいと述べた:

ルールは、我々は数字の正確なセットを持っているかどうかをテストするのは簡単ですのいずれかがの組み合わせである場合は、trueを返します。

この場合、アイテムを並べ替えると、回答はnアイテムの連続したグループにあります(nはその辺の数です)。

この理由は、できるだけ短い「長い」長さとできるだけ長い「短い」長さが必要なことです。つまり、それらはすべて一緒にグループ化されます。

このようにすれば、テストするオブジェクトの長さと辺の数のリストを取る次の一般的なメソッドを作成できます。私たちは、その後、リストをソートしてからn連続した項目のテストグループは、最初n-1項目の合計がnth項目以上であるかどうかを確認するために:のように、

private static bool CanCreateAShapeWithSideCount(List<double> lengths, int sideCount) 
{ 
    // Validate our input 
    if (sideCount < 1 || lengths == null || lengths.Count(l => l > 0) < sideCount) 
    { 
     return false; 
    } 

    // Get all lengths greater than zero and sort them 
    var validLengths = lengths.Where(l => l > 0).OrderBy(l => l).ToList(); 

    // Take groups of 'sideCount' size and return 'true' 
    // if the longest is less than the sum of the rest 
    for (int i = 0; i < validLengths.Count - sideCount + 1; i++) 
    { 
     var sideGroup = validLengths.Skip(i).Take(sideCount).ToList(); 
     var maxVal = sideGroup.Max(); 
     if (maxVal < sideGroup.Sum() - maxVal) return true; 
    } 

    // We didn't find a match, so return false 
    return false; 
} 

は、今、私たちは私たちの他のメソッドからこのジェネリックメソッドを呼び出すことができます三角形または四角形のテスト:

private static bool IsTriangle(double sideA, double sideB, double sideC) 
{ 
    var sides = new List<double> {sideA, sideB, sideC}; 
    return CanCreateAShapeWithSideCount(sides, 3); 
} 

// Test if a quadrilateral can be created from 5 lengths 
private static bool IsQuadrilateral(double sideA, double sideB, 
    double sideC, double sideD, double sideE) 
{ 
    var sides = new List<double> { sideA, sideB, sideC, sideD, sideE }; 
    return CanCreateAShapeWithSideCount(sides, 4); 
} 
+0

そしてそれはどのような価値をもたらしますか? –

+0

あなたが何を参照しているのかわからない...コードを読んだことがありますか? –