我从here下载了isaac64,但我在使用方面遇到了一些问题。 我不得不在isaac64.c中评论部分代码,因为它包含main函数。但我无法使用它...我无法正确初始化它并得到随机数,你能帮助我吗?我找不到任何例子。
randinit(TRUE); for(i=0;i<10;i++){ printf("%lx\n",rand()); }每次运行此代码时,我都会得到相同的值。我不知道如何设定种子。
答案 0 :(得分:3)
这个版本的ISAAC是一个&#34;参考实现&#34;这意味着它意在被提及,但不是特别用户友好或准备生产。 C中有任意数量的cryptographically secure random number generators更容易使用。特别是,在大多数操作系统上,简单地从/dev/random读取字节就足够了。
main
函数演示了如何使用该库。它已经用#ifdef
注释掉了。我发现using the Perl wrapper around ISAAC as a guide也有帮助。
int main()
{
/* Initialize the structure to 0 */
randctx ctx;
ctx.randa = ctx.randb = ctx.randc = (ub4)0;
/* Initialize the seed */
for (ub4 i=0; i<256; ++i) {
ctx.randrsl[i] = i;
}
/* Initialize the random numbers from the seed */
randinit(&ctx, TRUE);
/* Print 10 pseudo random numbers */
for(int i=0; i<10; i++) {
printf("%.8lx\n", rand(&ctx));
}
}
您必须提供seed
或"entropy"。如果您提供相同的种子,您将获得相同的结果。这就是ISAAC是一个 psuedo 随机数生成器的原因,它只能从现有的随机性中产生更多随机看似的数字。有a discussion of where to get your seed from in Math::Random::ISAAC。
如果这些是您的新概念,如果是生产代码,我强烈建议您只需阅读/dev/random
。这种ISAAC实现非常粗糙,加密非常容易 出错。 /dev/random
已经为您处理了所有这些事情。
如果您必须使用自己的伪随机库,请使用经过良好实施和记录的库,如OpenSSL。
如果您要完成此操作,我建议您调整the version of the code from the Perl wrapper,因为至少作者已将其清理为有价值的发布。