使用D.Knuth伪随机生成器

时间:2010-10-17 16:47:45

标签: c random modularity

我需要编写一个物理模拟软件,我需要使用pseudo-random generator written by D.Knuth,因为它最符合我的需要。

虽然我知道如何在一段硬代码中使用它(仅仅是#include“rng-double.c”),但我还是不太明白如何将它包含在模块化程序中主要和内部的一些库,然后我通过头文件链接回主。

我需要的唯一函数是ranf_start(seed)为种子生成种子,而ranf_arr_next()用于生成下一个数字。

我正在进行一系列的

multiple definitions of 'foo'

几乎是随机数生成器代码中定义的每个函数。

我不是专家,所以我发现自己几乎走到了尽头。有出路吗?我目前正在尝试为rng编写头文件,但我还没有成功。

非常感谢大家。 〜Ĵ

编辑: 从第一个答案开始,我需要得到头文件。我为生成器中的大多数函数做了它,但是我无法为实际生成数字的函数编写它。我应该如何为这样定义的函数编写标题?

#define ranf_arr_next() (*ranf_arr_ptr>=0? *ranf_arr_ptr++: ranf_arr_cycle())

3 个答案:

答案 0 :(得分:5)

您不包含.c文件,而是包含相应头文件,其中包含函数的声明。 .c文件将与其余文件一起编译。

答案 1 :(得分:2)

如果您发现自己#including .c文件,那么您可能会做错事。你真的应该只是#include .h文件。

This wikipedia link完全解释了您遇到的问题以及如何正确编写头文件。

我怀疑你的问题是你没有正确使用标题'guard'。

答案 2 :(得分:1)

RNG-double.h

#ifndef RNG_DOUBLE_H_INCLUDED
#define RNG_DOUBLE_H_INCLUDED

extern void ranf_start(long seed);
extern double ranf_next(void);

#ifdef USE_MACRO_RANF_NEXT
extern double *ranf_arr_ptr;
extern double  ranf_arr_cycle(void);
#define ranf_arr_next() (*ranf_arr_ptr >= 0 ? *ranf_ptr++ : ranf_arr_cycle())
#endif /* USE_MACRO_RANF_NEXT */

#endif /* RNG_DOUBLE_H_INCLUDED */

的main.c

#include "rng-double.h"
...other stuff...

RNG-double.c

#define USE_MACRO_RANF_NEXT
#include "rng-double.h"

double *ranf_arr_ptr;

void ranf_start(long seed)
{
    ...implementation...
}

double (ranf_next)(void)  // Function
{
    ranf_next();          // Macro
}

double ranf_arr_cycle(void)
{
    ...implementation...
}