2

我想使用 Mersenne Twister C 库之一(例如tinymtmtwist或 libbrahe),因此我可以将它用作rand()C 程序的种子。我找不到有关如何执行此操作的简单简约示例。

我已经使用 mtwist 包走了这么远,但是通过 pjs 的评论,我意识到这是错误的方法:

#include <stdio.h>
#include <stdlib.h>
#include "mtwist.h"

int main() {
    uint32_t random_value;

    random_value = mt_lrand();
    srand(random_value);
    printf("mtwist random: %d; rand: %d\n", random_value, rand());

    return 0;
}

(最初我写的是这段代码不会编译,但感谢 Carl Norum 的回答,我终于能够编译它。)

谁能给我一个简单的例子,说明如何使用任何 Mersenne Twister C 库正确生成随机数?

4

2 回答 2

5

下面是一个演示如何使用mtwistMersenne Twister 的实现:

#include <stdio.h>
#include <stdlib.h>
#include "mtwist.h"

int main(void) {
   int i;
   mt_seed();
   for(i = 0; i < 10; ++i) {
      printf("%f\n", mt_ldrand());
   }
   return EXIT_SUCCESS;
}

编译运行如下:

[pjs@amber:mtwist-1.4]$ gcc run-mtwist.c mtwist.c
[pjs@amber:mtwist-1.4]$ ./a.out
0.817330
0.510354
0.035416
0.625709
0.410711
0.980872
0.965528
0.444438
0.705342
0.368748
[pjs@amber:mtwist-1.4]$
于 2013-08-31T20:13:32.333 回答
2

这不是编译器错误,而是链接器错误。您缺少适当的-l标志来链接您正在使用的库。您的编译器调用应类似于:

cc -o example example.c -lmtwist

我只是快速浏览了您链接到的 mtwist 页面,它似乎只是作为源分发,而不是作为库分发。在这种情况下,将适当的实现文件添加到命令行应该可以:

cc -o example example.c mtwist.c

但是您可能应该研究一个make基于 mtwist 代码构建真正库的解决方案。

于 2013-08-31T17:09:11.987 回答