【问题标题】:use of D.Knuth pseudo-random generator使用 D.Knuth 伪随机发生器
【发布时间】:2010-10-18 04:57:35
【问题描述】:

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

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

我需要的唯一函数是 ranf_start(seed) 来播种生成器和 ranf_arr_next() 来生成下一个数字。

我得到了一个很长的系列

multiple definitions of 'foo'

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

我不是专家,所以我发现自己几乎处于死胡同。有出路吗?我目前正在尝试为 rng 编写一个头文件,虽然我还没有成功。

非常感谢大家。 ~J

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

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

【问题讨论】:

    标签: c random modularity


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您发现自己#include 一个 .c 文件,那么很可能您做错了什么。你真的应该只#include .h 文件。

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

      我怀疑您的问题是您没有正确使用标题“守卫”。

      【讨论】:

        【解决方案3】:

        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...
        }
        

        【讨论】:

        • 我去掉了 ranf_next 函数,因为我不想修改原始源代码,如果可能的话。在实践中,我将整个宏移动到标题中。感谢您的宝贵提示。顺便说一句,在您提出的代码中存在类型错误(ranf_start 吃长了)。
        猜你喜欢
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 2014-05-18
        • 1970-01-01
        • 2019-06-14
        • 2020-09-24
        相关资源
        最近更新 更多