簡単な質問があります:
デジタル パルス列 (最大 = 1、最小 = 0) をシミュレートしようとしています。ON 時間の分布は、二項分布に従う必要があります。どうすればいいですか?私は VisualStudio 2012 を使用しています。これは非常に些細な質問であり、誰かの時間を無駄にするつもりはありませんが、何らかの理由で、この問題について考えると頭が働きません。非常に大きなデータセット (300Mb) を生成する必要があります。
ありがとう!
簡単な質問があります:
デジタル パルス列 (最大 = 1、最小 = 0) をシミュレートしようとしています。ON 時間の分布は、二項分布に従う必要があります。どうすればいいですか?私は VisualStudio 2012 を使用しています。これは非常に些細な質問であり、誰かの時間を無駄にするつもりはありませんが、何らかの理由で、この問題について考えると頭が働きません。非常に大きなデータセット (300Mb) を生成する必要があります。
ありがとう!
Visual Studio のネイティブ RNG が 0 ~ M-1 の整数を生成する場合、K = p*M を計算します。任意の数の乱数を生成し、それらを K でしきい値処理して、バイナリ ランダム パルスを取得します。
他の方法は次のとおりです。
可能な各バイト (256 個全体) について、1 の数を数えます。p = 0.5*ProbabilityofOne(A) + 0.5*ProbabilityofOne(B) となるように、バイト A と B の 2 つのセット (サイズが異なる可能性があります) を作成します。ここで、常にランダムにセット (A または B) を選択し、セットから要素をランダムに選択します。このようにして、生成された乱数ごとに 8 つのパルスが得られます。
注: p は 1 の予想確率です。
これは、二項分布に従う数値を生成する方法を示しています。
私は Microsoft の例を編集し、変数に適切な名前を付けて全体を読みやすくしようとしました。
確率と統計については、長い間使用してきたため、理解が薄れているので、これが正しいことを願っています...
#include <random> //include the random number library
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
mt19937 rng; //create an instance of the Mersenne Twister PRNG
binomial_distribution<int, double> binomDistribution(2, 0.6); //create distribution using t=2 and p= 0.6
auto randomNumber = rng(); //get a random number from the RNG
auto binDistValue = binomDistribution(rng); //get a binomial distributed number from the RNG
std::cout << "p == " << binomDistribution.p() << std::endl;
std::cout << "t == " << binomDistribution.t() << std::endl;
binomDistribution.reset(); // discard any cached values
const auto valuesToPrint = 100;
cout << "First " << valuesToPrint << " values of the binomial distribution are:" << endl;
for(int i=0; i<valuesToPrint; ++i)
{
auto aSampledValue = binomDistribution(rng);
cout << aSampledValue << endl;
}
return (0);
}
また、この投稿をチェックして、さらに単純な例を確認してください。
重要なポイントは次のとおりです。