2013-02-26 32 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';