【问题标题】:Windows-equivalent of POSIX srandom(...) and random() functions?Windows 等效的 POSIX srandom(...) 和 random() 函数?
【发布时间】:2013-03-02 10:08:20
【问题描述】:

我正在尝试将一些代码从 UNIX 移植到 Windows,我需要一个 POSIX srandom(x)random() 函数的实现,对于给定的种子 x,生成与那个相同的数字序列符合 POSIX.1-2001。 Windows 上有哪些可用选项?

【问题讨论】:

    标签: c windows posix prng


    【解决方案1】:

    srandom 和家人是 glibc 的成员。您可以将随机/随机的the source code from glibc 复制到您的应用程序中,只要它与许可证兼容。如果您正在寻找另一种实现,任何小额

    请记住,POSIX 实际上是接口一致性,而不是实现一致性 - 它实际上并没有说明生成它的机制是什么,也没有说明结果数字应该是什么。

    如果您希望在多个平台上保证相同的数字序列,那么您不应该依赖任何随机数生成器的标准库实现,您应该自己制作或回收已知的实现。

    正如 JWWalker 在评论中提到的那样,有一个非常好的 boost random implementation,它为随机数提供了一组很好的 C++ 类,但那是 C++,而不是 C - 不同的语言,所以可能不是直接合适。

    【讨论】:

    • 对于开源随机数生成器,请参阅Random library of Boost
    • 链接已失效。我有一个需要编译的文件,我该怎么做才能替换 srandom?
    • @TomášZato 我已将链接更新为指向 glibc random.c 的源软件链接,该链接在可预见的未来应该仍然有效。它是 glibc 代码,并且有与之关联的许可证,这可能使其不适合使用。
    【解决方案2】:

    您可以在 Windows 中查看 rand_ssrand 函数。但是,我不确定它们是否符合 POSIX 标准。

    编辑

    一个更好的似乎是CryptGenRandom。 详情请查看link

    【讨论】:

    • rand_s不使用srand设置的种子,rand返回一个15位的随机数,不同于random返回的31位随机数。
    【解决方案3】:

    如果您正在寻找一些简单的伪随机生成器,您可以使用线性同余生成器http://en.wikipedia.org/wiki/Linear_congruential_generator

    例如。第一个例子:

    unsigned int seed = 2;
    
    unsigned int rand()
    {
       seed = 1664525 * seed + 1013904223;
       return seed;
    }
    
    void srand(unsigned int new_seed)
    {
       seed = new_seed;
    }
    

    【讨论】:

    • 注意未定义的行为!您可以改用unsigned 来避免 UB
    • 这不会编译。 x 变量是什么?
    • @swdev x 必须改为 seed
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2012-08-23
    • 1970-01-01
    • 2017-01-06
    • 2016-04-16
    • 2016-01-10
    相关资源
    最近更新 更多