【问题标题】:Two ways of initializing `rand()`初始化 rand() 的两种方法
【发布时间】:2018-02-20 20:47:58
【问题描述】:

大多数时候我看到 C 伪随机数生成器的初始化,它的内容如下:

 srand(time(NULL));

反正我看到 C++ 代码使用

srand(static_cast<unsigned int>(time(0)));

这两行是否等同于初始化的优点,还是有理由更喜欢 C++ 中更冗长的方式?

【问题讨论】:

  • 不是您问题的答案,但在 C++(11 或更高版本)中应该首选 this
  • 嗯,更好,更喜欢#include &lt;random&gt;
  • 这只是风格问题。如果您不编写显式转换,它将隐式执行相同的转换。
  • 你应该看这个:rand() Considered Harmful

标签: c++ static-cast srand


【解决方案1】:

std::time_t 的确切类型未指定。它通常是一个有符号整数。 std::srand 接受 unsigned(即unsigned int)参数。

因此std::time 返回的类型与std::srand 期望的类型不匹配。根据std::time_t 的确切类型,编译器可能会静默转换它,但也可能不会。

例如在 Windows 上使用 Visual C++ 编译器 time 返回一个 64 位 整数。这不能在不损失精度的情况下轻易转换为unsigned int,编译器可能会(应该?我不记得)警告。

因此进行强制转换,以确保将正确的类型传递给std::srand


作为传递给time 的参数的差异,在C++ 中0 在标准化之前已经隐式转换为空指针。 IIRC 现代 C(自 C99 以来?)也可以,但并非总是如此。因此,C 中的空指针符号常量NULL,C++ 中的整数常量0

请注意,从 C++11 开始,推荐的空指针是 nullptr

【讨论】:

  • 我记得其中一段代码是windows用户写的,现在说得通了!
猜你喜欢
  • 2015-07-21
  • 2014-04-18
  • 1970-01-01
  • 2017-01-30
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2011-07-17
相关资源
最近更新 更多