在C#中C ++相当于新的Random(种子)

时间:2011-12-05 18:25:01

标签: c# c++ random

当我们在C#中使用随机数生成器时,我们可以定义一个像

这样的变量
private Random _rndGenerator;

在课堂上然后打电话

_rndGenerator = new Random(seed);

在类的构造函数中正确。

我的问题是:

什么是这种定义的C ++等价物(即类中的RNG)。我认为这不是一个正确的使用方法

srand((unsigned int)seed);

正确?

2 个答案:

答案 0 :(得分:14)

C ++ 11具有更强大的随机数生成功能。这是一个例子:

#include <random>
#include <functional>

std::size_t get_seed(); // whatever is the preferred way of obtaining a seed

typedef std::mt19937 engine_type; // a Mersenne twister engine
std::uniform_int_distribution<engine_type::result_type> udist(0, 200);

engine_type engine;

int main()
{
  // seed rng first:
  engine_type::result_type const seedval = get_seed();
  engine.seed(seedval);

  // bind the engine and the distribution
  auto rng = std::bind(udist, engine);

  // generate a random number
  auto random_number = rng();

  return random_number;
}

获得种子的方法有很多种。 <random>可以使用std::random_device类提供对某些硬件熵的潜在访问权限,您可以使用该类为您的PRNG播种。

std::size_t get_seed() {
    std::random_device entropy;
    return entropy();
}

答案 1 :(得分:1)

C ++有一个内置的全局随机数生成器。如果你想播种它,那么srand((unsigned int)seed)就是你要走的路。但这与您展示的C#代码并不完全相同。当你写:

Random _rndGenerator = new Random(seed);

您将获得一个单独的随机数生成器实例。因此,您可以在程序中使用多个随机数生成器。据我所知,C ++库没有这样的构造,尽管C ++ 11看起来像。

简而言之,srand((unsigned int)seed)是正确的,如果您使用的是旧版本的C ++,或者您只是想在程序中使用一个RNG。如果您需要多个RNG,那么请使用C ++ 11,或者自己动手。