隨機數

  1. 在新標準之前,C/C++都依賴於一個簡單C庫函數rand來生成隨機數;此函數生成均勻分佈的僞隨機整數,每個隨機數的範圍在:0和一個系統相關的最大值(最少爲32767)之間;由於不同程序對隨機數的類型、範圍、分佈要求可能不同,此時通過rand函數轉換來滿足多種隨機數要求通常會引入非隨機性
  2. 定義在random頭文件中的隨機數庫,通過一組協作的類來解決上述問題:隨機數引擎類隨機數分佈類;引擎類可以生成unsigned隨機數序列,分佈類使用引擎類生成指定類型的、在給定範圍內的、服從特定概率分佈的隨機數
  3. C++程序不應該使用庫函數rand,而應使用defaulet_random_engine類和恰當的分佈類對象
  4. 大多數場合下,隨機數引擎的輸出不可直接使用;因爲輸出的值範圍通常與需要的不服,也稱之爲原始隨機數;隨機數引擎有很多中,具體可見P783頁,通常defaulet_random_engine引擎操作可見test_1
  5. 將隨機數引擎傳遞給分佈對象,而不是引擎的下一個值;見test_2
  6. 一個給定的隨機數發生器一直會生成相同的隨機數序列,一個函數如果定義了局部的隨機數發生器,應將隨機數引擎和分佈對象定義爲static的。否則,每次調用函數都會生成相同的序列
  7. 常見的隨機數引擎和隨機數分佈在 p781-p783
/**
 * @Author: phd
 * @Date: 2020/1/12
 * @Site: github.com/phdsky
 * @Description: NULL
 */

#include <iostream>
#include <random>
#include <vector>

using namespace std;

void print_random_k_values(default_random_engine &rng, int k) {
  for (size_t i = 0; i < k; ++i) {
    // use e() to call next random number
    cout << rng() << " ";
  }
  cout << endl;
}

void test_1() {
  int k_value = 10;
  default_random_engine rng;
  print_random_k_values(rng, k_value);

  int int_value = 233;
  default_random_engine another_rng(int_value);
  print_random_k_values(another_rng, k_value);

  rng.seed(int_value);
  print_random_k_values(rng, k_value);

  cout << "RNG min value: " << rng.min() << endl;
  cout << "RNG max value: " << rng.max() << endl;

  default_random_engine::result_type rng_type = 23333;
  cout << typeid(rng_type).name() << endl;
  cout << typeid(rng()).name() << endl;

  // random generator name
  cout << typeid(rng).name() << endl;
}

void test_2() {
  uniform_int_distribution<unsigned> u(0, 9);
  default_random_engine e;
  for (size_t i = 0; i < 10; ++i) {
    // cout << u(e()) << endl; // error: no matching function for call to object of type 'uniform_int_distribution<unsigned int>'
    cout << u(e) << " ";
  }
  cout << endl;
}


int main(int argc, char *argv[]) {
  test_1();
  test_2();

  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章