1

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

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;
}

如果您知道解决此问题的另一种官方方法,那不是严格的,我将不胜感激。

4

1 回答 1

0

您的代码目前在效率方面存在更大的问题假设您已将其定义masint 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.

于 2015-10-18T14:56:59.423 回答