0

この問題は解決されました - 修正されたコードを以下に示します

ここに問題があり、コードを少し調整するだけで済みますが、プログラムを修正できていないようです。

したがって、基本的にやりたいことは、時間間隔 dt (デルタ t) = 1s の 10000 間隔でのガイガー カウンターのカウント数に対して、nbin = 20 (ビンの数) のヒストグラムを作成する C++ プログラムを作成することです。 ; 5 s^(-1) の平均カウント レートを仮定します。ある時間間隔 deltat のカウント数を決定するために、以下に示す形式の while ステートメントを使用します。

while((t-=tau*log(zscale*double(iran=IM*iran+IC)))<deltat)count++;

この問題の背景として、総計数は n*mu で与えられ、これは総計数時間 T = n*deltat に比例することに注意してください。明らかに、この問題では n は 10000 に選択されており、deltat は 1 です。T = 10000 を与えます。

私が抱えている問題は、コードの出力 (以下に表示されます) が要素 0 に対して 10000 の「ヒット」(時間 deltat の 0 カウントに対応) を単純に与え、次にもちろん、0 の「ヒット」を与えることです。その後、hist[] 配列の他のすべての要素。一方、私が期待している出力は、5 カウント (1 秒あたり) で「ヒット」のピークを持つポアソン分布です。

あなたが提供できる助けを前もってありがとう、そして私は当面の問題の私の貧弱な説明をお詫びします! 私のコードを以下に示します。

#include <iostream>                                 // Pre-processor directives to include
#include <ctime>                                    //... input/output, time,
#include <fstream>                                  //... file streaming and
#include <cmath>                                    //... mathematical function headers

using namespace std;

int main(void) {

const unsigned IM = 1664525;                    // Integer constants for                
const unsigned IC = 1013904223;                 //... the RNG algorithm
const double zscale = 1.0/0xFFFFFFFF;           // Scaling factor for random double between 0 and 1
const double lambda = 5;                        // Count rate = 5s^-1
const double tau = 1/lambda;                    // Average time tau is inverse of count rate
const int deltat = 1;                           // Time intervals of 1s
const int nbin = 20;                            // Number of bins in histogram
const int nsteps = 1E4;

clock_t start, end;

int count(0);

double t = 0;                               // Time variable declaration

unsigned iran = time(0);                        // Seeds the random-number generator from the system time

int hist[nbin];                                 // Declare array of size nbin for histogram

// Create output stream and open output file

ofstream rout;
rout.open("geigercounterdata.txt");

// Initialise the hist[] array, each element is given the value of zero

for ( int i = 0 ; i < nbin ; i++ )
    hist[i] = 0;

start = clock();

// Construction of histogram using RNG process

for ( int i = 1 ; i <= nsteps ; i++ ) { 

    t = 0;
    count = 0;

    while((t -= tau*log(zscale*double(iran=IM*iran+IC))) < deltat)
        count++;        // Increase count variable by 1

    hist[count]++;          // Increase element "count" of hist array by 1

}

// Print histogram to console window and save to output file

for ( int i = 0 ; i < nbin ; i++ ) {

    cout << i << "\t" << hist[i] << endl;
    rout << i << "\t" << hist[i] << endl;

}

end = clock();

cout << "\nTime taken for process completion = "
     << (end - start)/double(CLOCKS_PER_SEC) 
     << " seconds.\n";

rout.close();

return 1;

}   // End of main() routine
4

1 に答える 1

1

while ループの数学について完全にフォローしているわけではありません。ただし、問題は確かに while ループの状態にあります。while ループを次のように分割しました。

count--;
do 
{
    iran=IM * iran + IC;            //Time generated pseudo-random
    double mulTmp = zscale*iran;    //Pseudo-random double 0 to 1
    double logTmp = log(mulTmp);    //Always negative (see graph of ln(x))
    t -= tau*logTmp;                //Always more than 10^4 as we substract negative
    count++; 
}  while(t < deltat);

コードから、ヒープが破損するため、常にcount = 0whent > 1および実行時エラー whenが発生することが明らかです。t < 1

残念ながら、私はあなたの計算の背後にある数学について完全にフォローしているわけではなく、なぜポアソン分布が予想されるのか理解できません。上記の問題については、先に進んで問題を解決する (そしてコミュニティに回答を共有する) か、より数学的な背景と参照を提供してください。修正されたコードで回答を編集します。以前に決定した場合は、ポアソン分布のドメインが であるため、 の値が 20 より小さい[0, infinity[かどうかを確認する必要があることに注意してください。countnbin

于 2013-10-17T21:45:52.950 に答える