c++ - rand() 没有给我一个随机数(即使使用 srand() 时)

标签 c++ random srand

好吧,我开始失去理智了。我想做的就是随机一个 0 到 410 之间的数字,并根据 this页面,我的代码应该做到这一点。由于我想要一个随机数而不是伪随机数,因此我也使用 srand() ,例如this线程告诉我要做的。但这不起作用。我得到的只是一个数字,该数字取决于自上次执行以来的时间。如果我例如尽可能快地再次执行它,该数字通常比上一个数字高6个数字,如果我等待更长的时间,它会更高,等等。当它达到410时,它会回到0并重新开始。我错过了什么?

编辑:哦,如果我删除 srand(time(NULL)); 行,我每次运行程序时都会得到相同的数字 (41)。这甚至不是伪随机的,这只是一个静态数字。只需复制 the article I linked to above 中的第一行代码仍然总是给我41号。我是《数字 23》续集中的明星,还是我错过了什么?

int main(void) {

    srand(time(NULL));
    int number = rand() % 410;

    std::cout << number << std::endl;

    system("pause");

}

最佳答案

这就是使用已弃用的随机数生成所得到的结果。

rand产生一个固定的数字序列(这本身就很好),而且效果非常非常糟糕。

你告诉rand通过srand顺序中从哪里开始。由于您的“起点”(称为 seed 顺便说一句)取决于自 1.1.1970 0:00:00 UTC 以来的秒数,因此您的输出显然取决于时间。

做你想做的事情的正确方法是使用 C++11 <random> 图书馆。在您的具体示例中,这看起来有点像这样:

std::mt19937 rng (std::random_device{}());
std::uniform_int_distribution<> dist (0, 409);

auto random_number = dist(rng);

有关rand的邪恶的更多信息以及<random>的优点看看this .

最后一句话,播种 std::mt19937就像我上面所做的那样并不是最优的,因为 MT 的状态空间比单次调用 std::random_device{}() 得到的 32 位空间大得多。 。这对于玩具程序和标准学校作业来说不是问题,但仅供引用:Here是我对播种 MT 整个状态空间的看法,以及答案中的一些有用的建议。

关于c++ - rand() 没有给我一个随机数(即使使用 srand() 时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27903779/

相关文章:

algorithm - 随机选择具有频率的项目的高效算法

c++ - 如何将 "Dummy"值替换为 std::cin?

c++ - 如何通过C++程序发送Email?

algorithm - 生成唯一 ID 的类/对象

python - 如何在 Python 2.7 中选择 3 个随机数?

c - 如何让随机值函数每次返回不同的值

c++ - fork进程之间的随机数是相同的

c++ - 64 位随机生成器种子

c++ - 用C++写一个代理类

c++ - 如何将数字转换为整数 vector ?