この問題は解決されました - 修正されたコードを以下に示します
ここに問題があり、コードを少し調整するだけで済みますが、プログラムを修正できていないようです。
したがって、基本的にやりたいことは、時間間隔 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