C++ std::random(C++11) std::mt19937 std::shuffle std::seed_seq 隨機數生成算法

std::random_device

random_device 類定義的函數對象可以生成用來作爲種子的隨機的無符號整數值。

std::random_device rd; 

構造函數有一個 string& 類型的參數,它有定義的默認值。在我們像這樣省略它時,會得到我們環境中默認的 random_device 對象。

用 random_device 對象生成一個種子值:

auto seed_value = rd();

std::seed_seq 種子序列

seed_seq 類是用來幫助設置隨機數生成器的初始狀態的,用來產生種子。

std::mt19937

std::mt19937是C++11加入的新特性,是一種高效的隨機數生成算法。它的用法和rand()相似,但是具有速度快,週期長的特點。它的名字就來自於週期長度219937-1。而rand()在windows下生成的數據範圍爲0-32767。而這個函數的隨機範圍大概在(-maxint,+maxint)之間。

std::random_device rd;
std::mt19937 generator(rd()); 

std::shuffle

可以將列表中的內容進行隨機排列。

簡單的洗牌算法:

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";

    system("pause");
    return 0;
}

來自cplusplus.com的例子:

// mersenne_twister_engine::seed example
#include <iostream>
#include <chrono>
#include <random>

int main ()
{
  typedef std::chrono::high_resolution_clock myclock;
  myclock::time_point beginning = myclock::now();

  // obtain a seed from a user string:
  std::string str;
  std::cout << "Please, enter a seed: ";
  std::getline(std::cin,str);
  std::seed_seq seed1 (str.begin(),str.end());

  // obtain a seed from the timer
  myclock::duration d = myclock::now() - beginning;
  unsigned seed2 = d.count();

  std::mt19937 generator (seed1);   // mt19937 is a standard mersenne_twister_engine
  std::cout << "Your seed produced: " << generator() << std::endl;

  generator.seed (seed2);
  std::cout << "A time seed produced: " << generator() << std::endl;

  return 0;
}

可以參考:http://www.cplusplus.com/reference/random/

發佈了55 篇原創文章 · 獲贊 3 · 訪問量 6622
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章