我从here下载了isaac64,但在使用上有一些问题。
我不得不在isaac64.c中注释一部分代码,因为它包含主函数。但我不能用它。。。我不能正确初始化它并得到随机数,你能帮我吗?我找不到任何例子。randinit(真);
对于(i=0;iprintf(“%lx\n”,rand());
}
每次运行此代码时,都会得到相同的值。我不知道如何播种。

最佳答案

这个版本的ISAAC是一个“参考实现”,意味着它是要被参考的,但不是特别友好的用户或准备生产。C中有任何数量的cryptographically secure random number generators更易于使用。特别是,在大多数操作系统上,只需从/dev/random读取字节就足够了。
main函数演示如何使用库。已经用#ifdefs注释过了。我发现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/

10-09 20:03