此问题现已解决 - 修改后的代码如下所示
我在这里有一个问题,我确信只需要少量调整代码,但我似乎无法更正程序。
所以,基本上我想要做的是编写一个 C++ 程序来构造一个 nbin = 20(箱数)的直方图,用于时间间隔 dt(delta t)= 1s 的 10000 个间隔中的盖革计数器的计数数; 假设平均计数率为 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 为 1s;给 T = 10000s。
我遇到的问题是我的代码的输出(将在下面显示)只是为元素 0 提供了 10000 个“命中”(对应于时间增量中的 0 个计数),然后当然是 0 个“命中” hist[] 数组的所有其他元素随后。而我期望的输出是泊松分布,其峰值“命中”为 5 个计数(每秒)。
提前感谢您提供的任何帮助,对于我对手头问题的糟糕解释,我深表歉意!我的代码如下所示:
#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