2017-07-17 73 views
-2

好吧,所以我寫了一個代碼,它給出了當一根棍子隨機分裂成三塊(隨着每個中斷選擇隨機和獨立)一個三角形可以形成的概率。如何改變一個程序爲三角形工作的四邊形

我試圖改變我的代碼,以便我們將棒分成五塊,程序找到能夠形成四邊形的概率。有沒有人看到改變代碼的方法,使其適用於五件和四邊形的情況。

原始代碼是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

歡迎來到[so]。請查看[問]並告訴我們您嘗試了什麼。這看起來像家庭作業,[所以]不是一項家庭作業服務。 – TemporalWolf

+0

你已經有了一個方法來測試四邊形,或者至少是測試四邊形的公式嗎?這需要先回答。另外,一個四邊形有4個邊,而不是5個。 –

+1

嘿,TemporalWolf。這不是功課。 –

回答

1

我認爲你需要一個通用的方法來解決這個問題是什麼讓你的公式更通用。

對於你檢查任何一對邊的總和大於第三邊的三角形。但是如果你真的考慮這個問題,你真正需要做的就是確保最長的一面小於其他兩個的總和。如果這種情況屬實,那麼所有其他情況也是如此。

此規則也適用於四邊形或任何其他形狀。基本上我們正在做的是確保如果我們放下最長的一面,並將另一端的鏈條連接到它的一端,那麼鏈條的末端將會到達長邊的另一端。

的規則是容易測試,如果我們有確切的組數字:

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

不知道你在說什麼......你讀過這段代碼嗎? –