C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でランダムに折った棒の断片からn角形を作れる確率を求める方法

問題概要

任意の長さの棒があり、その棒をランダムに n 個の断片(整数値または浮動小数点数)に分割することを考えます。このとき、分割された断片が n 角形(多角形)を形成できる確率を求めるのが本記事の目的です。

多角形が成立するためには、どの一辺も他のすべての辺の合計より短くなければなりません。この条件を満たす確率は、次の公式で計算できます。

P(E′) = 1 − P(E) = 1 − n / 2n−1

ここで、n は棒を分割した際に生成される断片の本数です。

入力例と出力例

入力 

length = 10 , pieces = 4

出力 

probability is : 0.5

説明 − 長さ10cmの棒を4つの部分に分割するケースです。

入力 

length = 5 , pieces = 3

出力 

probability is : 0.25

説明 − 長さ5cmの棒を3つの部分に分割するケースです。

補足:公式が成り立つ理由

n 本の断片が n 角形を形成できる条件は「最も長い断片の長さが、残りの断片の合計より小さいこと」です。ランダムな分割においてこの条件を満たす割合は 1 − n / 2n−1 となることが知られています。また、この確率は棒の元の長さ(len)には依存せず、分割数 n のみで決まる点にも注目してください。たとえば n=3 の場合は 1 − 3/4 = 0.25 となり、先ほどの出力例とも一致します。

プログラムで使用しているアプローチ

  • 棒の長さと分割後の断片の本数を入力として受け取る

  • 公式を適用して確率を計算する

  • 結果を出力する

アルゴリズム

開始
ステップ1 → 確率を計算する関数を宣言する
    double probab(unsigned len, unsigned pieces)
        unsigned a = (1 << (pieces-1)) を宣言
        return 1.0 - ((double)pieces) / ((double)a)) を返す
ステップ2 → main() 内で
    unsigned pieces = 4, len = 10 を宣言
    probab(len, pieces) を呼び出す
終了

C++実装例

#include<iostream>
using namespace std;
// 確率を計算する関数
double probab(unsigned len, unsigned pieces){
    unsigned a = (1 << (pieces-1));
    return 1.0 - ((double)pieces) / ((double)a);
}
int main(){
    unsigned pieces = 4, len = 10;
    cout <<"probability is : "<<probab(len, pieces);
    return 0;
}

※ 元のコードではビットシフト演算子が誤って記述されていましたが、正しくは (1 << (pieces-1)) のように左ビットシフトを使い、2n−1 を計算します。

出力

上記のコードを実行すると、次の出力が得られます −

probability is : 0.5
  1. C++で円をN回カットしたときのピース数を計算する方法

    問題の概要整数Nが与えられます。このNは、2次元平面上の円に対して加える「カット(切り込み)」の回数を表します。1回のカットによって円は2つに分けられるため、N回のカットを行った後に円がいくつのピースに分割されるかを求めるのが、この問題の目的です。計算式この問題はとてもシンプルで、次の式で答えを求めることができます。ピースの数 = 2 × カットの回数(N)各カットが円の中心を通って切断されると考えると、カット1回ごとにピースが2つずつ増えていくため、この式が成り立ちます。具体例入力: N = 1出力: 円のピース数: 2説明: 1回のカットで、円はちょうど2つの半分に分けられます。入力: N

  2. Windowsで使えるC++開発向けおすすめIDE 7選

    ```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe