我从here下载了isaac64,但在使用上有一些问题。
我不得不在isaac64.c中注释一部分代码,因为它包含主函数。但我不能用它。。。我不能正确初始化它并得到随机数,你能帮我吗?我找不到任何例子。randinit(真);
对于(i=0;iprintf(“%lx\n”,rand());
}
每次运行此代码时,都会得到相同的值。我不知道如何播种。
最佳答案
这个版本的ISAAC是一个“参考实现”,意味着它是要被参考的,但不是特别友好的用户或准备生产。C中有任何数量的cryptographically secure random number generators更易于使用。特别是,在大多数操作系统上,只需从/dev/random读取字节就足够了。main
函数演示如何使用库。已经用#ifdef
s注释过了。我发现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"。如果你提供同样的种子,你会得到同样的结果。这就是为什么艾萨克是一个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,因为至少作者已经清理了它,使之值得发布。
关于c - 如何在C中使用ISAAC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33402981/