【问题标题】:I need help to find out what this algorithm does我需要帮助来了解这个算法的作用
【发布时间】: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:很明显他试图运行它,你猜怎么着,他看到了随机数......如果我碰巧遇到同样的问题,我也无法弄清楚没有从外部寻求帮助。有点奇怪,但完全可以的问题,我真的想知道那些反对这个的人有什么问题。

标签: c algorithm math random


【解决方案1】:

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

一些 more research 建议这是 Knuth 的 subtractive 随机数生成器算法的 C 实现。

【讨论】:

  • 哇!!这就是我想听到的...此代码必须来自您找到的同一来源!!!谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2012-07-11
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2020-08-06
相关资源
最近更新 更多