ä¼ªéæºæ°çæ
éæºæ°åºæä¾çæéæºåä¼ªéæºæ°çç±»ãè¿äºç±»å æ¬ï¼
- ååéæºä½çæå¨ (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
[ç¼è¾] åé
ä¼ªéæºæ°çæ ç C ææ¡£
|