0

我有一个多图,其中有 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.
4

3 回答 3

8

你忘了srand

srand(time(NULL))

在代码的开头添加它。你只需要调用一次。它将根据当前时间播种。因为你有 time(NULL) 在那里你必须包括 time.h

于 2013-02-26T17:49:25.920 回答
4

你需要用一些东西来播种你的随机数。尝试srand (time(NULL));

于 2013-02-26T17:49:32.930 回答
1

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

<random>over的一些好处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';
于 2013-02-26T18:15:49.747 回答