我需要帮助才能找出这个算法的作用

时间:2014-12-04 15:45:05

标签: c algorithm math random

我得到了一个.C文件,我不知道它做了什么,我应该发现...运行后我觉得它是某种随机数发生器,但我完全不知道。 ..如果你们中的任何一个人见过在 rf 函数中实现的算法,我就会徘徊:

/* ===========================================HEADERS=============================================== */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* ============================================INIRAN================================================ */
typedef struct {
    int seme;
} iniran;

/* ==============================================RF================================================== */
float rf(int *idum){

    static int iff=0;
    static int inext, inextp, ma[55];
    int mj, mk;
    int i, k, ii;
    float ret_val;

    if (*idum<0 || iff==0) {
        iff=1;
        mj=161803398 - abs(*idum);
        mj %= 1000000000;
        ma[54]=mj;
        mk=1;

        for (i=1; i<=54; ++i){
           ii=(i*21)%55;
           ma[ii-1]=mk;
           mk=mj-mk;
           if (mk<0) {
               mk += 1000000000;
           }
           mj= ma[ii-1];
        }

    for(k=1; k<=4; ++k) {
        for(i=1; i<=55; ++i){
        ma[i-1] -= ma[(i+30)%55];
            if (ma[i-1]<0){
                ma[i-1] += 1000000000;
            }
        }
    }

    inext=0;
    inextp=31;
    *idum=1;
    }

    ++inext;
    if (inext==56){
        inext=1;
    }
    ++inextp;
    if (inextp==56){
        inextp=1;
    }
    mj=ma[inext-1]-ma[inextp-1];
    if (mj<0){
        mj += 1000000000;
    }
    ma[inext-1]=mj;
    ret_val=mj*1.0000000000000001e-9;
    return ret_val;
}

/* ============================================MAIN================================================ */
int main(void){

/* Variable declaration */
int Np=10000;
int jp1, jp2, jp3, jp4, jp5;

/* Rinominate struct */
iniran iniran1;
iniran1.seme=7593; 

jp1=1+floorf(Np*rf(&iniran1.seme));
jp2=1+floorf(Np*rf(&iniran1.seme));
jp3=1+floorf(Np*rf(&iniran1.seme));
jp4=1+floorf(Np*rf(&iniran1.seme));
jp5=1+floorf(Np*rf(&iniran1.seme));

printf("jp1 = %d, jp2 = %d, jp3 = %d, jp4 = %d, jp5 = %d \n", jp1, jp2, jp3, jp4, jp5);

return 0;
}

要运行它,您必须在终端中输入gcc test.c -lm。我知道这些信息很少,但也许你以前见过这种算法,你可能会帮助我理解它是怎么回事......欢迎提出任何建议

1 个答案:

答案 0 :(得分:6)

只需搜索Google上的代码,例如this question使用类似的变量名和常量(注意例如161803398或数组ma 55个元素)。事实上(我的Fortran有点生锈)它似乎是完全相同的算法 - 而这个问题是关于一个随机数生成器。

有些more research表示这是Knuth subtractive随机数生成器算法的C实现。