Math.Random等效于C ++

时间:2015-01-14 00:55:07

标签: c++ random

我已经用Java编程了三年,并且一直使用Math.random()来获取一个随机数。我是C ++的新手,我想知道是否有相同的东西但是在C ++中呢?我可以使用的特定功能或方法?还包括一个解释。非常感谢!

4 个答案:

答案 0 :(得分:3)

C ++提供了一个相当不错的随机数库<random>,但它还没有那种简单的API初学者通常想要的。如下所示,生成这样的API很容易,并且希望在某些时候包含一些这样的API。

C ++ API将随机数生成分为两部分,即“随机性”源,以及将随机性转换为具有特定分布的数字的机制。随机数的许多基本用法并不特别关心“随机性”的来源有多好(或快或小),并且它们只需要“均匀”分布。因此,通常推荐的随机源是“Mersenne Twister”引擎。您可以创建其中一个并将其播种:

#include <random>

int main() {
  std::mt19937 eng{42};
}

现在eng是一个可以传递并用作随机位源的对象。它是一个值类型,因此您可以复制它,分配它等,就像正常值一样。在线程安全方面,访问此值就像访问任何其他值一样,因此如果您需要多个线程,则应该在每个线程上放置引擎或使用互斥。

要将引擎中的数据转换为随机值,请使用分发对象。典型用途需要“均匀”分布,因此对于整数值,请使用std::uniform_int_distribution<int>

std::uniform_int_distribution<int> dice{1, 6};

分发对象是一个函数对象,您可以通过调用它并从中传递它将使用的随机源来获取它的值:

auto die_roll = dice(eng);

要记住的一件事是,生成随机值的数学应该封装在分布对象中。如果您发现自己对结果进行了某种转换,那么您可能应该使用不同的分布。不要做dist(eng) % 10dist(eng) / 6.0 + 10.0之类的事情。库中提供了其他几个发行版,包括用于生成具有各种发行版的浮点值的发行版。

这是一种非常简单的方法来包装<random>功能以便简单使用:

#include <iostream>
#include <random>

std::mt19937 seeded_eng() {
  std::random_device r;
  std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
  return std::mt19937(seed);
}

class Random {
  std::mt19937 eng = seeded_eng();
public:
  auto operator()(int a, int b) {
    std::uniform_int_distribution<int> dist(a, b);
    return dist(eng);
  }
};

int main() {
  Random random;
  for (int i = 0; i < 10; ++i) {
    std::cout << "Dice: " << random(1, 6) << " " << random(1, 6) << '\n';
  }
}

答案 1 :(得分:1)

#include <iostream>
#include <ctime>

int main()
{
    srand((unsigned int) time (NULL)); //activates the generator
    //...
    int a = rand()%10;        //gives a random from 0 to 9

    double r = ((double) rand() / (RAND_MAX));        //gives a random from 0 to 1

    int max, min;
    //...
    int c = (rand()%(max - min)) + min;              //gives a random from min to max
    //...
    return 0;
}

这些方式最简单。 有时它意味着&#34;最好的&#34;,有时 - 不是。

答案 2 :(得分:0)

1.srand((unsigned)time(0))将确保每次运行程序时rand()函数将获得一个新种子,导致它产生不同的或“随机”输出。如果没有stand((无符号)时间(0)),rand()将产生相同的输出。

2.int Number,用于存储rand()函数生成的随机数。 rand()%27将为您提供数字0-26。

#include <iostream>
#include <ctime>

int main()
{
    srand((unsigned)time(0))
    int Number = ((rand() % 27));
    cout << Number << endl;

    return 0;
}

答案 3 :(得分:0)

这是一个简单的解决方案。函数random是重载的。一个实例用于获取整数的随机数生成器。另一个实例用于获取双精度的随机数生成器。拥有这两个函数后,应用程序变得相当简单,就像在main函数中可以看到的那样。

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <ostream>
#include <random>

// Single global engine, a better version of std::rand
std::mt19937 engine{ std::random_device()() };

// Returns a generator producing uniform random integers in the closed range [a, b]
std::function<int()> random(int a, int b)
{
    auto dist = std::uniform_int_distribution<>(a, b);

    return std::bind(dist, std::ref(engine));
}

// Returns a generator producing uniform random doubles in the half-open range [x, y)
std::function<double()> random(double x, double y)
{
    auto dist = std::uniform_real_distribution<>(x, y);

    return std::bind(dist, std::ref(engine));
}

int main()
{
    const auto no_iterations = int{ 12 };

    auto dice = random(1, 6);

    // Roll the dice a few times and observe the outcome
    std::generate_n(std::ostream_iterator<int>(std::cout, " "),
        no_iterations, dice);
    std::cout << std::endl;

    // U is a uniform random variable on the unit interval [0, 1]
    auto U = random(0.0, 1.0);

    // Generate some observations
    std::vector<double> observations;
    std::generate_n(std::back_inserter(observations), no_iterations, U);

    // Calculate the mean of the observations
    auto sum = std::accumulate(observations.cbegin(), observations.cend(), 0.0);
    auto mean = sum / no_iterations;
    std::cout << "The mean is " << mean << std::endl;

    return 0;
}