C++ 计算区间数频率的有效算法

C++ 计算区间数频率的有效算法,c++,algorithm,counter,frequency,frequency-distribution,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]

我需要建立一个条形图来说明由线性同余方法确定的伪随机数的分布

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;
}
float mas[10]={0,0,0,0,0,0,0,0};
无效1()
{
INTX=-2,m=437,a=33,c=61;
浮动u;
对于(int i=0;i您的代码目前存在一个更大的效率问题。假设您将
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;
}
[更多省略]

看起来你并没有计划过要产生负数,如果你没有做到这一点,那么当你在
mas
的范围外建立索引时,结果就是未定义的行为。你的代码目前有一个更大的效率问题。假设你已经将
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;
}
[更多省略]


看起来您并没有计划好生成负数,如果您没有做到这一点,那么当索引超出
mas

的范围时,结果就是未定义的行为。您想了解算法吗?还是想有效地获得所需的结果?您真的有性能问题吗有了这个?我需要一个关于这个问题的新解决方案。如果可能的话,效率更高。我对这个代码没有任何问题。你想了解算法吗?或者你想有效地得到你想要的结果吗?你真的有性能问题吗?我需要一个关于这个问题的新解决方案。如果可能的话,效率更高。我没有这个代码有问题吗