每次运行时计算不同的数字

时间:2013-02-26 17:47:53

标签: c++

我有一个多图,其中有1000个数字。现在我需要生成一个随机数。说它560.然后我将采取阵列的第560个元素。我用兰特。

int number = 0;
int size = mmap.size();
int rand = rand() % size + 1;

但问题是,我正在运行这个程序n次。每次,我得到相同数量的随机值。每次运行程序时如何生成随机值。

  i tried using including random library. it gave error when i compile.

3 个答案:

答案 0 :(得分:8)

你忘记了srand

srand(time(NULL))

在代码的开头添加它。你只需要打电话一次。它将根据当前时间播种。由于你有时间(NULL),你必须包括time.h

答案 1 :(得分:4)

你需要用随机数来种子。试试srand (time(NULL));

答案 2 :(得分:1)

除了播种随机数生成器之外,我建议您尽可能完全避免使用rand()。它通常不是一个非常好的pRNG,并且常见的用法(例如rand() % size)会产生偏差的结果。如果可用,更好的替代方法是标准C ++ <random>库。

<random>优于rand()的一些好处:

  • 几种具有明确特征的发动机,以满足不同的需求。
  • 预定义的分发版,比生成自己的版本更容易使用。
  • 在线程程序中明确指定的行为。

示例:

#include <random>
#include <iostream>
#include <functional>

int main() {
    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 e(seed);

    int size = 10;
    std::uniform_int_distribution d(1,size);

    std::cout << d(e) << '\n';
}

如果更适合您的使用,您还可以将所有内容绑定到一个函数对象中。

#include <functional>

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

auto rand = std::bind(std::uniform_int_distribution<>(1,size),
                      std::mt19937(seed));
std::cout << rand() << '\n';