如何在C中实现Mersenne Twister随机数生成?

我想使用其中一个Mersenne Twister C库(例如tinymt , mtwist或libbrahe), 因此我可以将它用作 C程序中rand()的种子 。 我无法找到一个关于如何做到这一点的简单简约示例。

我用mtwist包得到了这个,但是通过pjs的评论,我意识到这是错误的做法:

 #include  #include  #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库正确生成随机数的简单示例?

这是一个如何使用mtwist Twister的mtwist实现的演示:

 #include  #include  #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]$ 

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

 cc -o example example.c -lmtwist 

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

 cc -o example example.c mtwist.c 

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