【发布时间】:2015-02-02 13:46:19
【问题描述】:
我得到了一个 .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。我知道信息很少,但也许你以前见过这种算法,你可以帮助我理解它是怎么回事......欢迎任何建议
【问题讨论】:
-
在你的编译器中调试...你的编译器会告诉你这段代码是做什么的。
-
@MukitChowdhury:很明显他试图运行它,你猜怎么着,他看到了随机数......如果我碰巧遇到同样的问题,我也无法弄清楚没有从外部寻求帮助。有点奇怪,但完全可以的问题,我真的想知道那些反对这个的人有什么问题。