2013-02-26 34 views
0

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

回答

8

您忘记了srand

srand(time(NULL)) 

在代码的开头添加此代码。你只需要调用一次。它会根据当前时间播种。由于你有时间(空)在那里,你必须包括time.h

+0

哎呀抱歉..我真的错过了。顺便说一句,我们如何设置限制..我只需要它在1和2000之间 – srinath 2013-02-26 17:51:17

+1

@srinath:http://stackoverflow.com/a/2999130/179910 – 2013-02-26 17:52:46

+0

@srinath:http://stackoverflow.com/a/686373/241536 – 2013-02-26 17:53:43

4

你需要种子你的随机数的东西。尝试srand (time(NULL));

1

除了播种你的随机数发生器,我建议你尽量避免rand(),如果可能的话。这通常不是一个很好的计划,常见的用法(如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';