具有时间函数的C - 种子中的伪随机数发生器

时间:2014-02-23 05:16:33

标签: c random compiler-construction numbers generator

所以我正在尝试创建一个伪随机数生成器,它将返回指定范围内的RN,以便稍后在我的程序中使用。

不幸的是,我的编译器(gcc)不会识别类型“time_t”,函数“time()”等等。我以为我已经包含了正确的标题 - 但仍然有错误编译。我可能只是累了,但谷歌搜索错误并没有产生有用的信息 - 所以我转向伟大的stackoverflow。如果问题简单而且我只是忽略它,我道歉......

我的包含声明:

#include "param.h"
#include "mmu.h"
#include "x86.h"
#include "proc.h"
#include "spinlock.h"
#include "pstat.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

RNG:

static int random_range (unsigned int min, unsigned int max){
    // Get value from system clock and place in seconds variable
    time_t seconds;
    // Convert seconds to a unsigned integer.
    time(&seconds);
    // Set seed
    srand((unsigned int) seconds);

    int base_r = rand(); 
    if (RAND_MAX == base_r) return random_range(min, max);
      // now guaranteed to be in [0, RAND_MAX) 
        int range       = max - min,
        int remainder   = RAND_MAX % range,
        int bucket      = RAND_MAX / range;
      // There are range buckets, plus one smaller interval within remainder of RAND_MAX 
        if (base_random < RAND_MAX - remainder) {
            return min + base_random/bucket;
        }

    else return random_in_range (min, max);

}

与上述相关的编译错误 - 并非所有错误因为我确定我缺少一些包含声明或类似声明:

kernel/proc.c:9:18: error: time.h: No such file or directory
kernel/proc.c:10:20: error: stdlib.h: No such file or directory
kernel/proc.c:11:19: error: stdio.h: No such file or directory
kernel/proc.c: In function ‘random_range’:
kernel/proc.c:31: error: ‘time_t’ undeclared (first use in this function)
kernel/proc.c:31: error: (Each undeclared identifier is reported only once
kernel/proc.c:31: error: for each function it appears in.)
kernel/proc.c:31: error: expected ‘;’ before ‘seconds’

4 个答案:

答案 0 :(得分:1)

是的,你累了。请注意,您的编译器甚至无法找到<stdio.h>

kernel/proc.c:10:20: error: stdlib.h: No such file or directory

你需要尝试编译一个简单的“hello world”程序 - 现在编译器显然在查找包含文件的错误位置。您通常可以使用-I some/path告诉编译器在哪里查找包含文件...您能显示编译命令吗?

你的makefile是否可能包含-nostdinc标志?这通常是在编译内核代码时完成的......请参阅http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

答案 1 :(得分:1)

啊......我想我明白了:

xv6无法使用stdlib函数调用。我将不得不创建自己的随机函数。

有什么建议吗?请链接我......我知道那里有一些叫做“东西”的东西 - 应该是好的。

答案 2 :(得分:1)

您正在编译文件:

kernel/proc.c

所以你明显在内核中工作。您可能没有意识到这一点,但标准库不存在,无法编译到内核中。

内核开发环境中不存在

stdio.hstdlib.htime.h,这就是您收到错误的原因。

你需要#include <linux/time.h>来获取时间...不是因为你说的话,它会帮助你很多,rand()函数集在内核中不起作用。

现在,如果你包含#include <linux/random.h>,那么你可以使用

void get_random_bytes(void  *buf, int nbytes);

此接口将返回所请求的随机字节数并将其放入缓冲区。如此有效地你可以做到:

int i;

get_random_bytes(&i, sizeof i);

如果您看到条目/dev/random/dev/urandom,则这是该文件系统条目的内核端。

答案 3 :(得分:0)

根据您发布的错误,很明显您的编译器无法找到标准库头文件。这是问题的根源。

相关问题