C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- å¸¸ç¨æ°å¦å½æ°
- æ°å¦ç¹æ®å½æ°
- ä¼ªéæºæ°çæ
- std::uniform_random_bit_generator
- std::linear_congruential_engine
- std::mersenne_twister_engine
- std::srand
- std::rand
- std::subtract_with_carry_engine
- std::discard_block_engine
- std::independent_bits_engine
- std::shuffle_order_engine
- std::random_device
- std::uniform_int_distribution
- std::uniform_real_distribution
- std::generate_canonical
- std::bernoulli_distribution
- std::binomial_distribution
- std::negative_binomial_distribution
- std::geometric_distribution
- std::poisson_distribution
- std::exponential_distribution
- std::gamma_distribution
- std::weibull_distribution
- std::extreme_value_distribution
- std::normal_distribution
- std::lognormal_distribution
- std::chi_squared_distribution
- std::cauchy_distribution
- std::fisher_f_distribution
- std::student_t_distribution
- std::discrete_distribution
- std::piecewise_constant_distribution
- std::piecewise_linear_distribution
- std::seed_seq
- RAND_MAX
- std::midpoint
- std::lerp
- std::has_single_bit
- std::bit_ceil
- std::bit_floor
- std::bit_width
- std::rotl
- æµ®ç¹ç¯å¢
- std::complex
- std::valarray
- ç¼è¯æ¶æçæ°ç®æ¯
- std::gcd
- std::lcm
- æ°å¦å¸¸æ°
- std::bit_cast
- std::rotr
- std::countl_zero
- std::countl_one
- std::countr_zero
- std::countr_one
- std::popcount
- 注é
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >æ°å¼åº > ä¼ªéæºæ°çæ
ä¼ªéæºæ°çæ
éæºæ°åºæä¾çæéæºåä¼ªéæºæ°çç±»ãè¿äºç±»å æ¬ï¼
- ååéæºä½çæå¨ (URBG) ï¼å å«éæºæ°å¼æï¼å®ä»¬æ¯ä¼ªéæºæ°çæå¨ï¼çææ¥æååå叿´æ°åºåçä¼ªéæºæ°çæå¨ï¼ä»¥åçéæºæ°çæå¨ï¼è¥å¯ç¨ã
- éæºæ°åå¸ï¼ä¾å¦ååãæ£æææ³æ¾åå¸ï¼ï¼å®ä»¬å° URBG çè¾åºè½¬æ¢ä¸ºåç§ç»è®¡åå¸ã
URBG ååå¸è¢«è®¾è®¡ä¸ºç¸äºä½¿ç¨ä»¥çæéæºå¼ãææéæºæ°å¼æé½å¯ä»¥æå®å°æç§ãåºåååååºååï¼ä»¥ç¨äºå¯éå¤ç模æå¨ã
ååéæºä½çæå¨
ååéæºä½çæå¨æ¯å½æ°å¯¹è±¡ï¼å®è¿åæ ç¬¦å·æ´æ°å¼ï¼å¹¶ä½¿å¾æ¯ä¸ªå¼å¨å¯è½ç»æçèå´ä¸æ¥æï¼çæ³ä¸ï¼ç¸çç被è¿åæ¦çã
ææååéæºä½çæå¨é½æ»¡è¶³ååéæºä½çæå¨ (UniformRandomBitGenerator) è¦æ±ã C++20 亦å®ä¹ uniform_random_bit_generator æ¦å¿µã
| å®ä¹äºå¤´æä»¶
<random> | |
| (C++20) |
æå®ç±»åå
·å¤ä½ä¸ºååéæºä½çæå¨çèµæ ¼ (æ¦å¿µ) |
éæºæ°å¼æ
éæºæ°å¼æä»¥ç§åæ°æ®ä¸ºçµæºçæä¼ªéæºæ°ãæ°ç§ä¸åç±»çä¼ªéæºæ°çæç®æ³å®ç°ä¸ºè½å®å¶ç模æ¿ã
éæ©ä½¿ç¨ä½ç§å¼ææ¶åå°å¤æ¬¡æè¡¡ï¼çº¿æ§åä½å¼æä¸è¬å°å¿«ï¼å¹¶å¯¹ç¶æçåå¨è¦æ±é常å°ãå»¶è¿ææ³¢é£å¥çæå¨å¨æ å è¿ç®æ¯æä»¤éçå¤çå¨ä¸é常快ï¼ä½ç¶æåå¨è¾ä¸ºåºå¤§ï¼ææ¶æä¸å¤ªæ³è¦çå è°±ç¹æ§ãæ¢ æ£®ç¼ ç»å¨è¾æ ¢ä¸æ¥æè¾å¤§çç¶æåå¨è¦æ±ï¼ä½åªè¦ææ£ç¡®çåæ°ï¼å°±ä¼ææé¿ççä¸å¯éå¤åºåï¼ä¸æ¥æææ³è¦çå è°±ç¹æ§ï¼å¯¹äºç»å®çæ³è¦çå®ä¹ï¼ã
| å®ä¹äºå¤´æä»¶
<random> | |
| (C++11) |
å®ç°çº¿æ§åä½ç®æ³ (类模æ¿) |
| (C++11) |
å®ç°æ¢
æ£®ç¼ ç»å¨ç®æ³ (类模æ¿) |
| (C++11) |
å®ç°å¸¦è¿ä½åï¼ä¸ç§å»¶è¿ææ³¢é£å¥ï¼ç®æ³ (类模æ¿) |
éæºæ°å¼æéé å¨
éæºæ°å¼æéé å¨çæä»¥å¦ä¸éæºæ°å¼æä¸ºçµæºçä¼ªéæºæ°ãå®ä»¬é常ç¨äºæ¹æ¢åºå±å¼æçå è°±ç¹æ§ã
| å®ä¹äºå¤´æä»¶
<random> | |
| (C++11) |
èå¼éæºæ°å¼æçæäºè¾åº (类模æ¿) |
| (C++11) |
å°ä¸ä¸ªéæºæ°å¼æçè¾åºæå
为æå®ä½æ°çå (类模æ¿) |
| (C++11) |
以ä¸å顺åºåéä¸ä¸ªéæºæ°å¼æçè¾åº (类模æ¿) |
é¢å®ä¹éæºæ°çæå¨
å®ä¹äºæ°ä¸ªç¹å«çæµè¡ç®æ³ã
| å®ä¹äºå¤´æä»¶
<random> | |
| Â | |
| ç±»å | å®ä¹ |
minstd_rand0(C++11)
|
std::linear_congruential_engine<std::uint_fast32_t, 16807, 0, 2147483647> ç± LewisãGoodman å Miller åç°äº 1969ï¼ç± Park ä¸ Miller äº 1988 é纳为âæå°æ åâ |
minstd_rand(C++11)
|
std::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647> è¾æ°çâæå°æ åâï¼ä¸º Parkã Miller å Stockmeyer äº 1993 æ¨è |
mt19937(C++11)
|
std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, |
mt19937_64(C++11)
|
std::mersenne_twister_engine<std::uint_fast64_t, 64, 312, 156, 31, |
ranlux24_base(C++11)
|
std::subtract_with_carry_engine<std::uint_fast32_t, 24, 10, 24> |
ranlux48_base(C++11)
|
std::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12> |
ranlux24(C++11)
|
std::discard_block_engine<std::ranlux24_base, 223, 23> 24 ä½ RANLUX çæå¨ï¼ç± Martin Lüscher ä¸ Fred James è®¾è®¡äº 1994 |
ranlux48(C++11)
|
std::discard_block_engine<std::ranlux48_base, 389, 11> 48 ä½ RANLUX çæå¨ï¼ç± Martin Lüscher ä¸ Fred James è®¾è®¡äº 1994 |
knuth_b(C++11)
|
std::shuffle_order_engine<std::minstd_rand0, 256> |
default_random_engine(C++11)
|
å®ç°å®ä¹ |
éç¡®å®éæºæ°
std::random_device æ¯éç¡®å®çååéæºä½çæå¨ï¼å°½ç®¡è¥ä¸æ¯æéç¡®å®éæºæ°çæï¼åå 许å®ç°ç¨ä¼ªéæºæ°å¼æå®ç° std::random_device ã
| (C++11) |
使ç¨ç¡¬ä»¶çµæºçéç¡®å®éæºæ°çæå¨ (ç±») |
éæºæ°åå¸
éæºæ°åå¸åå¤ç URBG çè¾åºï¼ä»¥ä½¿å¾è¾åºç»ææç §å®ä¹çç»è®¡æ¦çå¯åº¦å½æ°åå¸ã
éæºæ°å叿»¡è¶³éæºæ°åå¸ (RandomNumberDistribution)
| å®ä¹äºå¤´æä»¶
<random> | |
åååå¸ | |
| (C++11) |
产çå¨ä¸ä¸ªèå´ä¸åååå¸çæ´æ°å¼ (类模æ¿) |
| (C++11) |
产çå¨ä¸ä¸ªèå´ä¸åååå¸ç宿°å¼ (类模æ¿) |
伯åªå©åå¸ | |
| (C++11) |
产ç伯åªå©åå¸ä¸ç bool å¼ã (ç±») |
| (C++11) |
产çäºé¡¹åå¸ä¸çæ´æ°å¼ã (类模æ¿) |
| 产çè´äºé¡¹åå¸ä¸çæ´æ°å¼ã (类模æ¿) | |
| (C++11) |
产çå ä½åå¸ä¸çæ´æ°å¼ã (类模æ¿) |
æ³æ¾åå¸ | |
| (C++11) |
äº§çæ³æ¾åå¸ä¸çæ´æ°å¼ã (类模æ¿) |
| (C++11) |
äº§çææ°åå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产ç Î åå¸ä¸ç宿°å¼ (类模æ¿) |
| (C++11) |
产çå¨å¸å°åå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产çæå¼åå¸ä¸ç宿°å¼ã (类模æ¿) |
æ£æåå¸ | |
| (C++11) |
äº§çæ åæ£æï¼é«æ¯ï¼åå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产çå¯¹æ°æ£æåå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产ç Ï2 åå¸ä¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
äº§çæ¯è¥¿åå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产çè´¹èå° F åå¸ä¸ç宿°å¼ã (类模æ¿) |
| (C++11) |
产çå¦ç t åå¸ä¸ç宿°å¼ã (类模æ¿) |
éæ ·åå¸ | |
| (C++11) |
产ç离æ£åå¸ä¸çéæºæ´æ°ã (类模æ¿) |
| 产çåå¸å¨å¸¸ååºé´ä¸ç宿°å¼ã (类模æ¿) | |
| 产çåå¸å¨å®ä¹çååºé´ä¸ç宿°å¼ã (类模æ¿) | |
å·¥å ·
| å®ä¹äºå¤´æä»¶
<random> | |
| (C++11) |
ç»å®ç²¾åº¦çåååå¸å¨ [0, 1) ä¸ç宿°å¼ (彿°æ¨¡æ¿) |
| (C++11) |
éç¨çåå·®æ¶é¤çæ··æ·ç§ååºåçæå¨ (ç±») |
C éæºåº
é¤äºä¸è¿°ç弿ååå¸ï¼æ¥èª C éæºåºç彿°å常é亦å¯ç¨ï¼å°½ç®¡ä¸æ¨èï¼
| å®ä¹äºå¤´æä»¶
<cstdlib> | |
| çæä¼ªéæºæ° (彿°) | |
| åå§åä¼ªéæºæ°çæå¨ (彿°) | |
| std::rand çæçæå¤§å¯è½å¼ (å®å¸¸é) | |
示ä¾
#include <iostream> #include <iomanip> #include <string> #include <map> #include <random> #include <cmath>  int main() { // ä»¥éæºå¼æç§ï¼è¥å¯è½ std::random_device r;  // éæ© 1 ä¸ 6 é´çéæºæ° std::default_random_engine e1(r()); std::uniform_int_distribution<int> uniform_dist(1, 6); int mean = uniform_dist(e1); std::cout << "Randomly-chosen mean: " << mean << '\n';  // çæå´ç»å¹³åå¼çæ£æåå¸ std::seed_seq seed2{r(), r(), r(), r(), r(), r(), r(), r()}; std::mt19937 e2(seed2); std::normal_distribution<> normal_dist(mean, 2);  std::map<int, int> hist; for (int n = 0; n < 10000; ++n) { ++hist[std::round(normal_dist(e2))]; } std::cout << "Normal distribution around " << mean << ":\n"; for (auto p : hist) { std::cout << std::fixed << std::setprecision(1) << std::setw(2) << p.first << ' ' << std::string(p.second/200, '*') << '\n'; } }
å¯è½çè¾åºï¼
Randomly-chosen mean: 4 Normal distribution around 4: -4 -3 -2 -1 0 * 1 *** 2 ****** 3 ******** 4 ********* 5 ******** 6 ****** 7 *** 8 * 9 10 11 12