我得到了一个.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
。我知道这些信息很少,但也许你以前见过这种算法,你可能会帮助我理解它是怎么回事......欢迎提出任何建议
答案 0 :(得分:6)
只需搜索Google上的代码,例如this question使用类似的变量名和常量(注意例如161803398或数组ma
55个元素)。事实上(我的Fortran有点生锈)它似乎是完全相同的算法 - 而这个问题是关于一个随机数生成器。
有些more research表示这是Knuth subtractive随机数生成器算法的C实现。