【问题标题】:Pseudorandom number generator in C - seeding with time functionsC中的伪随机数生成器 - 使用时间函数播种
【发布时间】:2014-03-24 17:49:59
【问题描述】:

所以我正在尝试创建一个伪随机数生成器,它将返回指定范围内的 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’

【问题讨论】:

  • 我认为您的编译器配置可能有问题,因为它显然甚至无法识别标准库头文件。
  • 为什么不包括头文件,我不知道...
  • 我正在使用 xv6 包含的 make 文件。没有调整任何东西。

标签: c random compiler-construction numbers generator


【解决方案1】:

你正在编译文件:

kernel/proc.c

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

内核开发环境中不存在stdio.hstdlib.htime.h,所以会报错。

您需要#include &lt;linux/time.h&gt; 来获取时间...并不是说它对您有多大帮助,因为正如您所说,rand() 函数集在内核中不起作用。

现在如果你包含#include &lt;linux/random.h&gt; 那么你可以使用

void get_random_bytes(void  *buf, int nbytes);

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

int i;

get_random_bytes(&i, sizeof i);

如果您曾经看到过 /dev/random/dev/urandom 条目,这是该文件系统条目的内核部分。

【讨论】:

  • 一段时间后我意识到内核中的 stdlib 问题 - 但我仍在寻找 RNG 问题的解决方案。将在早上尝试您的实施。太累了,现在不能继续。
  • @katiea - 运气好吗?如果您需要,我可以提供一个更好的示例。回顾我的描述,它不是最好的,而且写得太晚了。 :)
  • 嗨迈克!您的解决方案很有意义,但我采用了不同的实现。谢谢!
  • 我转到另一个问题,但这个项目今天到期。我最终没有一个正常运行的项目......我只是想弄清楚我哪里出错了。如果您想尝试并提供帮助,请点击此处:stackoverflow.com/questions/22006642/xv6-scheduler-proc-never-0
【解决方案2】:

是的,你累了。请注意,您的编译器似乎甚至找不到&lt;stdio.h&gt;

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

【讨论】:

  • 使用标准 xv6 make 文件 - 我无法更改此文件。它必须与包含的 make 文件一起使用。如果我删除 RNG - 它会编译并运行......也许我将 func 放在错误的位置。
  • 你是说当你在这个文件中有你的函数定义时,编译器只会抱怨无法找到包含文件?或者当您不在构建中包含此源文件时是否可以?你试过#include "stdio.h"而不是&lt;&gt;吗?
  • 在我发布的下面查看我的答案。问题是在编辑 xv6 内核文件时首先包含 stdlib。
【解决方案3】:

啊……我想我明白了:

xv6 不能使用 stdlib 函数调用。我必须创建自己的随机函数。

有什么建议吗?请给我链接...我知道那里有一种叫做“某物”的东西——应该很好的捻线机。

【讨论】:

  • 梅森捻线机是您正在寻找的。在math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/… 有许多指向源代码的链接
  • 是的,那个。我可能应该睡觉了......等等,不 - 有编码要做!
  • 现在睡觉,早上再试一次。它会更好地工作。现在是星期六晚上 - 你应该已经过了你的 Ballmer peak
  • 哦,如果我现在的决策中只涉及酒精...谢谢你,弗洛里斯,提供链接。还有
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2010-11-01
    • 2011-02-08
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多