【问题标题】:Combining rand() and srand() for better performance [closed]结合 rand() 和 srand() 以获得更好的性能[关闭]
【发布时间】:2012-11-07 02:52:49
【问题描述】:

所以,我正在制作一个 DLL,我想要一个函数来生成随机数。我想知道这些选项中哪个更有效(性能方面)。

这只是在 DLL 中创建一个函数,让我可以得到一个随机数。

int getRand(unsigned int seed) {
    int rNum;  // Random Number.

    srand(seed);
    rNum = (rand() % // Whatever I need here.
}

或者,在应用程序中仅使用srand(time(nullptr))rand() 会提高性能吗?

谢谢,

约翰尼·P.

【问题讨论】:

  • 每次在rand() 之前调用srand() 是没有意义的。 srand() 用于种子随机数序列。一开始只使用一次。
  • 在担心微优化之前,您可能会从学习 PRNG 工作原理中获益更多!或者,正如俗话所说,“让好代码变得更快比让快速代码变得更好更容易”。
  • @jogojapan 我为什么不呢?我以为每次我想要一个随机数时都必须播种,这样我就不会每次都得到相同的数字?
  • rand() 每次都会更新随机数生成器的内部状态。所以你想再次获得相同的数字(或者当然有时只是通过同时发生)。

标签: c++ performance visual-c++ dll random


【解决方案1】:

实际上没有任何必要创建一个函数来组合对srand() 的调用和对rand() 的调用。

srand() 用于播种(即初始化)随机数序列。然后使用对rand() 的后续和重复调用来实际生成随机数。 (rand() 会更新随机数生成器的内部状态,因此(通常)下次调用时不会再次生成相同的数字。)

如果您在调用rand() 之前每次调用srand(),则每次都会重新初始化序列。如果每次传递的种子都相同,那么您的函数每次都会返回相同的随机数。

因此,无论如何,这两个调用都必须分开。

您可能还对 C++11 中 <random> 标头提供的随机数生成框架感兴趣。下面是示例代码(大部分是从 cppreference 复制的):

#include <random>
#include <iostream>

int main()
{
  /* Initialise and seed. Do this only once. */
  std::random_device rd;
  std::mt19937 gen(rd());

  /* Define how to use the raw random numbers, i.e.
     a probability distribution. In this case a
     uniform distribution with six possible integer
     events. */
  std::uniform_int_distribution<> dis(1, 6);

  /* Generate a series of random events. No reseeding. */
  for(int n=0; n<10; ++n)
      std::cout << dis(gen) << ' ';

  std::cout << std::endl;
}

cppreference 对&lt;random&gt; 标头及其提供的许多选项有很好的描述:http://en.cppreference.com/w/cpp/numeric/random

其中大部分灵感来自 Boost 随机库,它提供了更多选项:http://www.boost.org/doc/libs/1_52_0/doc/html/boost_random.html(链接到 1.52.0 版本)。因此,如果您不能使用 C++11,或者您需要标准未提供的功能,则使用 Boost 库可能是一个好主意。

【讨论】:

  • 我从来不知道 C++11 有一个框架!谢谢!你有关于这个框架的更多信息吗?
  • @Tux 我已经包含了一些链接。
  • 谢谢!无论如何,我可以获得所有 C++11 新功能的链接吗?
  • @Tux 有 许多 新特性...开始的一种方法是查看它们的列表(例如,这里的 C++11 特性列表GCC:gcc.gnu.org/projects/cxx0x.html,或维基百科条目:en.wikipedia.org/wiki/C%2B%2B11)然后在 SO 上搜索这些功能的名称。编译器和教科书都不是最新的,因此某些功能(例如正则表达式)目前很难使用。
  • 谢谢,如果可能,一定会开始使用这些新功能!
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2019-10-24
  • 2021-01-23
  • 2016-08-13
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多