它是正确的随机发生器功能吗?

时间:2014-05-27 13:08:04

标签: c++

我使用此函数生成随机整数。

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));
..............
}

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

您的第一个版本不符合您的要求:

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。)

答案 2 :(得分:1)

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

我认为Netscape once had a bug由于经常播种随机数生成器,导致其SSL实施更容易破解。

答案 3 :(得分:1)

  

是不是?

如果您的意思是“它是否产生随机数?”,答案是

如果你的意思是“它是最佳的吗?”然后答案是。您只需要初始化一次随机数序列。

  

移动srand可能更好(时间(0));到主要功能

也许......(你知道你需要什么比我们更好)。

你想要实现什么(也就是说,你使用这个随机生成器是什么)?如果它是任何有财务数据,在线赌博应用程序(或任何需要/管理/花钱)的东西,它是不行的(也不是使用srand和rand - 你需要更强的东西)。