用于计算间隔中数字频率的高效算法

时间:2015-10-18 13:24:12

标签: c++ algorithm counter frequency frequency-distribution

我需要建立一个条形图,用于说明通过线性同余方法确定的伪随机数的分布

Xn+1 = (a * Xn + c) mod m
U = X/m
区间[0,1]

上的

例如:

Interval           Frequency     
[0;0,1]            0,05
[0,1;0,2]          0,15
[0,2;0,3]          0,1
[0,3;0,4]          0,12
[0,4;0,5]          0,1
[0,5;0,6]          0,15
[0,6;0,7]          0,05
[0,7;0,8]          0,08
[0,8;0,9]          0,16
[0,9;1,0]          0,4

我使用了这样一种方法:

float mas[10] = {0,0,0,0,0,0,0,0,0,0};
void metod1()
{
    int x=-2, m=437, a=33, c=61;
    float u;
    for(int i=0;i<m;i++){
        x=(a*x + c) % m;
        u=(float)x/(float)m;
        int r;
        r = ceil(u*10);
        mas[r] = mas[r] + 1;
    }
    for(i=0;i<10;i++) cout<<"["<<(float)i/10<<";"<<(float)(i+1)/10<<"]"<<" | "<<mas[i]<<"\n-----------------"<<endl;
    return;
}

如果你知道另一个解决这个问题的方法,那不是直截了当的,我会很感激。

1 个答案:

答案 0 :(得分:0)

您的代码目前有一个很多更大的问题效率。假设您已将mas定义为类似int mas[10];的内容,则它具有未定义的行为。

要查看问题,请修改代码以打印出其生成的r值:

void metod1() {
    int mas[11] = { };
    int x = -2, m = 437, a = 33, c = 61;
    float u;
    for (int i = 0; i < m; i++) {
        x = (a*x + c) % m;
        u = (float)x / (float)m;
        int r;
        r = ceil(u * 10);
        //mas[r] = mas[r] + 1;
        std::cout << r << '\t';
    }
//    for (i = 0; i < 10; i++) cout << "[" << (float)i / 10 << ";" << (float)(i + 1) / 10 << "]" << " | " << mas[i] << "\n-----------------" << endl;
    return;
}

然后让我们看一下结果:

0       -2      -7      -4      -7      -7      -6      0       -6      -1
-5      -6      -1      -9      -7      -2      -7      -3      0       -6
0       -8      -5      -6      -8      -6      -7      0       -2      -6
-7      -6      -2      -4      -9      0       -4      -5      -1      -2
-5      0       -2      -1      -4      -8      -5      -2      -8      -5
-9      -4      -5      -7      -9      -8      -3      -9      -9      -9
-3      -4      -5      -3      -9      -6      -5      -3      -1      0
-5      -5      -6      -7      -9      -5      -4      -1      -5      -1
-9      -2      0       -9      -6      -7      -5      -5      -3      -3
-9      -3      0       -4      -1      -1      0       -8      -4      -4
-2      -7      0       -6      -6      -8      -4      -8      -2      -8
-8      -2      -4      -7      -1      -6      -1      -3      -7      -3
-5      -9      -8      -5      -8      -7      -4      -1      -8      -7
-7      -2      -9      -5      -3      0       2       8       8       2
6       8       7       1       5       2       8       4       1       5
10      1       3       6       4       10      5       6       6       10

[更多省略]

它并不像您计划的那样因为您将产生负数这一事实,如果您没有这样做,结果将是未定义的在mas的范围之外进行索引时的行为。