【问题标题】:Is it correct random generator function? [duplicate]它是正确的随机生成器函数吗? [复制]
【发布时间】:2014-07-16 10:04:10
【问题描述】:

我使用这个函数来生成随机整数。

int rnd(int min, int max)
{
    static int srand(time(0));
    return min + rand() % max;
}

对吗?将srand(time(0)); 移动到主要功能可能会更好吗?像这样:

int rnd(int min, int max){
    return min + rand() % max;
}
int main(){
srand(time(0));
..............
}

【问题讨论】:

  • @DebasishJana 不!你说的不对!
  • static int srand(time(0)); 不调用srand
  • @πάνταῥεῖ,这里有什么问题?调用包含函数时会初始化静态数据
  • 顺便说一句,随机库(在 C++ 中)提供了更简洁的方式来生成随机数(如 std::uniform_int_distribution)。
  • 静态初始化错误。可能是static int somevar = srand(time(0));,但前提是 srand 返回了一些虚拟值。

标签: c++


【解决方案1】:

对吗?

如果您的意思是“它会生成随机数吗?”,答案是

如果您的意思是“它是最优的吗?”那么答案是。随机数序列只需初始化一次即可。

移动 srand(time(0)); 可能会更好到主函数

也许......(你比我们更清楚你需要什么)。

你想达到什么目的(也就是说,你用这个随机生成器做什么)?如果是带有财务数据的任何东西、在线赌博应用程序(或任何需要/管理/花费金钱的东西),那就不行了(也不能使用 srand 和 rand - 你需要更强大的东西)。

【讨论】:

    【解决方案2】:

    您的第一个版本没有达到您的预期:

    int rnd(int min, int max)
    {
        static int srand(time(0));
        return min + rand() % max;
    }
    

    这不会调用函数srand。它声明了一个int 类型的静态变量,并为其分配了time(0) 的值。就像int a(42);(或C++11 中的int a{42};)声明一个整数并将其设置为42


    一定要使用第二种变体。如果您想拥有另一个以不同方式创建随机值的函数,它也会让生活变得更加轻松。


    此外,我强烈建议您使用std::random(或boost::random,如果由于某些不明原因而不允许使用C++11)。

    【讨论】:

    • +1 用于提及<random>rand() 现在不鼓励使用。
    【解决方案3】:

    一般你只需要初始化一次伪随机数生成器,所以在main函数中是个好主意。

    我相信Netscape once had a bug 是由于过于频繁地对随机数生成器进行播种,导致其 SSL 实现更容易被破解。

    【讨论】:

      【解决方案4】:

      当然。您现在不是调用该函数,而是创建一个名为 srand 的整数变量,而不是隐藏全局 srand()

      每次重新播种随机生成器并没有帮助——如果在同一秒内调用它甚至会返回相同的值!在main() 中只调用一次会更好。

      也应该是min + rand() % (max - min + 1)

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 2016-03-08
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        相关资源
        最近更新 更多