581 lines
43 KiB
HTML
581 lines
43 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>伪随机数生成</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_numeric_random skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">伪随机数生成</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-numeric.html">numeric</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>随机数库提供生成随机和伪随机数的类。这些类包括:</p>
|
|
<ul>
|
|
<li>均匀随机位生成器 (URBG) ,包含随机数引擎,它们是伪随机数生成器,生成拥有均匀分布整数序列的伪随机数生成器,以及真随机数生成器,若可用。</li>
|
|
<li>随机数分布(例如<a href="cpp-numeric-random-uniform_int_distribution.html">均匀</a>、<a href="cpp-numeric-random-normal_distribution.html">正态</a>或<a href="cpp-numeric-random-poisson_distribution.html">泊松分布</a>),它们将 URBG 的输出转换为各种统计分布。</li>
|
|
</ul>
|
|
<p>URBG 和分布被设计为相互使用以生成随机值。所有随机数引擎都可以指定地播种、序列化和反序列化,以用于可重复的模拟器。</p>
|
|
<h3><span class="mw-headline" id=".E5.9D.87.E5.8C.80.E9.9A.8F.E6.9C.BA.E4.BD.8D.E7.94.9F.E6.88.90.E5.99.A8">均匀随机位生成器</span></h3>
|
|
<p><i>均匀随机位生成器</i>是函数对象,它返回无符号整数值,并使得每个值在可能结果的范围中拥有(理想上)相等的被返回概率。</p>
|
|
<p>所有均匀随机位生成器都满足<a href="cpp-named_req-UniformRandomBitGenerator.html"><span style="font-style:italic">均匀随机位生成器</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(UniformRandomBitGenerator)</span></a> 要求。 C++20 亦定义 <a href="cpp-numeric-random-uniform_random_bit_generator.html"><code>uniform_random_bit_generator</code></a> 概念。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-uniform_random_bit_generator.html"><span class="t-lines"><span>uniform_random_bit_generator</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>指定类型具备作为均匀随机位生成器的资格<br />
|
|
<span class="t-mark">(概念)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E9.9A.8F.E6.9C.BA.E6.95.B0.E5.BC.95.E6.93.8E">随机数引擎</span></h4>
|
|
<p>随机数引擎以种子数据为熵源生成伪随机数。数种不同类的伪随机数生成算法实现为能定制的模板。</p>
|
|
<p>选择使用何种引擎涉及到多次权衡:线性同余引擎一般地快,并对状态的存储要求非常小。延迟斐波那契生成器在无先进算术指令集的处理器上非常快,但状态存储较为庞大,有时有不太想要的谱特性。梅森缠绕器较慢且拥有较大的状态存储要求,但只要有正确的参数,就会有最长的的不可重复序列,且拥有最想要的谱特性(对于给定的想要的定义)。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-linear_congruential_engine.html"><span class="t-lines"><span>linear_congruential_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实现<a href="https://en.wikipedia.org/wiki/Linear_congruential_generator" class="extiw" title="enwiki:Linear congruential generator">线性同余</a>算法<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-mersenne_twister_engine.html"><span class="t-lines"><span>mersenne_twister_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实现<a href="https://en.wikipedia.org/wiki/Mersenne_twister" class="extiw" title="enwiki:Mersenne twister">梅森缠绕器</a>算法<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-subtract_with_carry_engine.html"><span class="t-lines"><span>subtract_with_carry_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实现带进位减(一种<a href="https://en.wikipedia.org/wiki/Lagged_Fibonacci_generator" class="extiw" title="enwiki:Lagged Fibonacci generator">延迟斐波那契</a>)算法<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E9.9A.8F.E6.9C.BA.E6.95.B0.E5.BC.95.E6.93.8E.E9.80.82.E9.85.8D.E5.99.A8">随机数引擎适配器</span></h4>
|
|
<p>随机数引擎适配器生成以另一随机数引擎为熵源的伪随机数。它们通常用于改换底层引擎的谱特性。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-discard_block_engine.html"><span class="t-lines"><span>discard_block_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>舍弃随机数引擎的某些输出<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-independent_bits_engine.html"><span class="t-lines"><span>independent_bits_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>将一个随机数引擎的输出打包为指定位数的块<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-shuffle_order_engine.html"><span class="t-lines"><span>shuffle_order_engine</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>以不同顺序发送一个随机数引擎的输出<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E9.A2.84.E5.AE.9A.E4.B9.89.E9.9A.8F.E6.9C.BA.E6.95.B0.E7.94.9F.E6.88.90.E5.99.A8">预定义随机数生成器</span></h4>
|
|
<p>定义了数个特别的流行算法。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc-hitem">
|
|
<td>类型</td>
|
|
<td>定义</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>minstd_rand0</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-linear_congruential_engine.html"><span class="kw1480">std::<span class="me2">linear_congruential_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw126">std::<span class="me2">uint_fast32_t</span></span></a>, <span class="nu0">16807</span>, <span class="nu0">0</span>, <span class="nu0">2147483647</span><span class="sy1">></span></span></span><br />
|
|
<p>由 Lewis、Goodman 及 Miller 发现于 1969,由 Park 与 Miller 于 1988 采纳为“最小标准”</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>minstd_rand</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-linear_congruential_engine.html"><span class="kw1480">std::<span class="me2">linear_congruential_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw126">std::<span class="me2">uint_fast32_t</span></span></a>, <span class="nu0">48271</span>, <span class="nu0">0</span>, <span class="nu0">2147483647</span><span class="sy1">></span></span></span><br />
|
|
<p>较新的“最小标准”,为 Park、 Miller 及 Stockmeyer 于 1993 推荐</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>mt19937</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-mersenne_twister_engine.html"><span class="kw1481">std::<span class="me2">mersenne_twister_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw126">std::<span class="me2">uint_fast32_t</span></span></a>, <span class="nu0">32</span>, <span class="nu0">624</span>, <span class="nu0">397</span>, <span class="nu0">31</span>,<br />
|
|
<span class="nu12">0x9908b0df</span>, <span class="nu0">11</span>,<br />
|
|
<span class="nu12">0xffffffff</span>, <span class="nu0">7</span>,<br />
|
|
<span class="nu12">0x9d2c5680</span>, <span class="nu0">15</span>,<br />
|
|
<span class="nu12">0xefc60000</span>, <span class="nu0">18</span>, <span class="nu0">1812433253</span><span class="sy1">></span></span></span><br />
|
|
32 位梅森缠绕器,由松本与西村设计于 1998</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>mt19937_64</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-mersenne_twister_engine.html"><span class="kw1481">std::<span class="me2">mersenne_twister_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw127">std::<span class="me2">uint_fast64_t</span></span></a>, <span class="nu0">64</span>, <span class="nu0">312</span>, <span class="nu0">156</span>, <span class="nu0">31</span>,<br />
|
|
<span class="nu12">0xb5026f5aa96619e9</span>, <span class="nu0">29</span>,<br />
|
|
<span class="nu12">0x5555555555555555</span>, <span class="nu0">17</span>,<br />
|
|
<span class="nu12">0x71d67fffeda60000</span>, <span class="nu0">37</span>,<br />
|
|
<span class="nu12">0xfff7eee000000000</span>, <span class="nu0">43</span>, <span class="nu0">6364136223846793005</span><span class="sy1">></span></span></span><br />
|
|
64 位梅森缠绕器,由松本与西村设计于 2000</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>ranlux24_base</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-subtract_with_carry_engine.html"><span class="kw1482">std::<span class="me2">subtract_with_carry_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw126">std::<span class="me2">uint_fast32_t</span></span></a>, <span class="nu0">24</span>, <span class="nu0">10</span>, <span class="nu0">24</span><span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>ranlux48_base</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-subtract_with_carry_engine.html"><span class="kw1482">std::<span class="me2">subtract_with_carry_engine</span></span></a><span class="sy1"><</span><a href="cpp-types-integer.html"><span class="kw127">std::<span class="me2">uint_fast64_t</span></span></a>, <span class="nu0">48</span>, <span class="nu0">5</span>, <span class="nu0">12</span><span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>ranlux24</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-discard_block_engine.html"><span class="kw1483">std::<span class="me2">discard_block_engine</span></span></a><span class="sy1"><</span><a href="cpp-numeric-random-subtract_with_carry_engine.html"><span class="kw1491">std::<span class="me2">ranlux24_base</span></span></a>, <span class="nu0">223</span>, <span class="nu0">23</span><span class="sy1">></span></span></span><br />
|
|
<p>24 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>ranlux48</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-discard_block_engine.html"><span class="kw1483">std::<span class="me2">discard_block_engine</span></span></a><span class="sy1"><</span><a href="cpp-numeric-random-subtract_with_carry_engine.html"><span class="kw1492">std::<span class="me2">ranlux48_base</span></span></a>, <span class="nu0">389</span>, <span class="nu0">11</span><span class="sy1">></span></span></span><br />
|
|
<p>48 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994</p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>knuth_b</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-random-shuffle_order_engine.html"><span class="kw1485">std::<span class="me2">shuffle_order_engine</span></span></a><span class="sy1"><</span><a href="cpp-numeric-random-linear_congruential_engine.html"><span class="kw1487">std::<span class="me2">minstd_rand0</span></span></a>, <span class="nu0">256</span><span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>default_random_engine</code><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td><i>实现定义</i></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E9.9D.9E.E7.A1.AE.E5.AE.9A.E9.9A.8F.E6.9C.BA.E6.95.B0">非确定随机数</span></h4>
|
|
<p><span class="t-lc"><a href="cpp-numeric-random-random_device.html">std::random_device</a></span> 是非确定的均匀随机位生成器,尽管若不支持非确定随机数生成,则允许实现用伪随机数引擎实现 <span class="t-lc"><a href="cpp-numeric-random-random_device.html">std::random_device</a></span> 。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-random_device.html"><span class="t-lines"><span>random_device</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>使用硬件熵源的非确定随机数生成器<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E9.9A.8F.E6.9C.BA.E6.95.B0.E5.88.86.E5.B8.83">随机数分布</span></h3>
|
|
<p>随机数分布后处理 URBG 的输出,以使得输出结果按照定义的统计概率密度函数分布。</p>
|
|
<p>随机数分布满足<a href="cpp-named_req-RandomNumberDistribution.html"><span style="font-style:italic">随机数分布</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(RandomNumberDistribution)</span></a> 。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E5.9D.87.E5.8C.80.E5.88.86.E5.B8.83">均匀分布</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-uniform_int_distribution.html"><span class="t-lines"><span>uniform_int_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生在一个范围上均匀分布的整数值<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-uniform_real_distribution.html"><span class="t-lines"><span>uniform_real_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生在一个范围上均匀分布的实数值<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E4.BC.AF.E5.8A.AA.E5.88.A9.E5.88.86.E5.B8.83">伯努利分布</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-bernoulli_distribution.html"><span class="t-lines"><span>bernoulli_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Bernoulli_distribution" class="extiw" title="enwiki:Bernoulli distribution">伯努利分布</a>上的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> 值。<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-binomial_distribution.html"><span class="t-lines"><span>binomial_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Binomial_distribution" class="extiw" title="enwiki:Binomial distribution">二项分布</a>上的整数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-negative_binomial_distribution.html"><span class="t-lines"><span>negative_binomial_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Negative_binomial_distribution" class="extiw" title="enwiki:Negative binomial distribution">负二项分布</a>上的整数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-geometric_distribution.html"><span class="t-lines"><span>geometric_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Geometric_distribution" class="extiw" title="enwiki:Geometric distribution">几何分布</a>上的整数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E6.B3.8A.E6.9D.BE.E5.88.86.E5.B8.83">泊松分布</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-poisson_distribution.html"><span class="t-lines"><span>poisson_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Poisson_distribution" class="extiw" title="enwiki:Poisson distribution">泊松分布</a>上的整数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-exponential_distribution.html"><span class="t-lines"><span>exponential_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Exponential_distribution" class="extiw" title="enwiki:Exponential distribution">指数分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-gamma_distribution.html"><span class="t-lines"><span>gamma_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生 <a href="https://en.wikipedia.org/wiki/Gamma_distribution" class="extiw" title="enwiki:Gamma distribution">Γ 分布</a>上的实数值<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-weibull_distribution.html"><span class="t-lines"><span>weibull_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Weibull_distribution" class="extiw" title="enwiki:Weibull distribution">威布尔分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-extreme_value_distribution.html"><span class="t-lines"><span>extreme_value_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Generalized_extreme_value_distribution" class="extiw" title="enwiki:Generalized extreme value distribution">极值分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E6.AD.A3.E6.80.81.E5.88.86.E5.B8.83">正态分布</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-normal_distribution.html"><span class="t-lines"><span>normal_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Normal_distribution" class="extiw" title="enwiki:Normal distribution">标准正态(高斯)分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-lognormal_distribution.html"><span class="t-lines"><span>lognormal_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Lognormal_distribution" class="extiw" title="enwiki:Lognormal distribution">对数正态分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-chi_squared_distribution.html"><span class="t-lines"><span>chi_squared_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生 <a href="https://en.wikipedia.org/wiki/Chi-squared_distribution" class="extiw" title="enwiki:Chi-squared distribution">χ<sup>2</sup> 分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-cauchy_distribution.html"><span class="t-lines"><span>cauchy_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Cauchy_distribution" class="extiw" title="enwiki:Cauchy distribution">柯西分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-fisher_f_distribution.html"><span class="t-lines"><span>fisher_f_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/F-distribution" class="extiw" title="enwiki:F-distribution">费舍尔 F 分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-student_t_distribution.html"><span class="t-lines"><span>student_t_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生<a href="https://en.wikipedia.org/wiki/Student%27s_t-distribution" class="extiw" title="enwiki:Student's t-distribution">学生 t 分布</a>上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E9.87.87.E6.A0.B7.E5.88.86.E5.B8.83">采样分布</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-discrete_distribution.html"><span class="t-lines"><span>discrete_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生离散分布上的随机整数。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-piecewise_constant_distribution.html"><span class="t-lines"><span>piecewise_constant_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生分布在常子区间上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-piecewise_linear_distribution.html"><span class="t-lines"><span>piecewise_linear_distribution</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>产生分布在定义的子区间上的实数值。<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.B7.A5.E5.85.B7">工具</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-random.html"><random></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-generate_canonical.html"><span class="t-lines"><span>generate_canonical</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>给定精度的均匀分布在 [0, 1) 上的实数值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-seed_seq.html"><span class="t-lines"><span>seed_seq</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>通用的偏差消除的混淆种子序列生成器<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id="C_.E9.9A.8F.E6.9C.BA.E5.BA.93">C 随机库</span></h3>
|
|
<p>除了上述的引擎和分布,来自 C 随机库的函数和常量亦可用,尽管不推荐:</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-cstdlib.html"><cstdlib></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-rand.html"><span class="t-lines"><span>rand</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>生成伪随机数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-srand.html"><span class="t-lines"><span>srand</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>初始化伪随机数生成器<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-RAND_MAX.html"><span class="t-lines"><span>RAND_MAX</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-random-rand.html">std::rand</a></span> 生成的最大可能值<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <iomanip></span>
|
|
<span class="co2">#include <string></span>
|
|
<span class="co2">#include <map></span>
|
|
<span class="co2">#include <random></span>
|
|
<span class="co2">#include <cmath></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="co1">// 以随机值播种,若可能</span>
|
|
<a href="cpp-numeric-random-random_device.html"><span class="kw1486">std::<span class="me2">random_device</span></span></a> r<span class="sy4">;</span>
|
|
|
|
<span class="co1">// 选择 1 与 6 间的随机数</span>
|
|
std<span class="sy4">::</span><span class="me2">default_random_engine</span> e1<span class="br0">(</span>r<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-numeric-random-uniform_int_distribution.html"><span class="kw1501">std::<span class="me2">uniform_int_distribution</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> uniform_dist<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">6</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> mean <span class="sy1">=</span> uniform_dist<span class="br0">(</span>e1<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Randomly-chosen mean: "</span> <span class="sy1"><<</span> mean <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 生成围绕平均值的正态分布</span>
|
|
<a href="cpp-numeric-random-seed_seq.html"><span class="kw1500">std::<span class="me2">seed_seq</span></span></a> seed2<span class="br0">{</span>r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span>, r<span class="br0">(</span><span class="br0">)</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-numeric-random-mersenne_twister_engine.html"><span class="kw1489">std::<span class="me2">mt19937</span></span></a> e2<span class="br0">(</span>seed2<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-numeric-random-normal_distribution.html"><span class="kw1512">std::<span class="me2">normal_distribution</span></span></a><span class="sy1"><></span> normal_dist<span class="br0">(</span>mean, <span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<a href="cpp-container-map.html"><span class="kw1281">std::<span class="me2">map</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="sy1">></span> hist<span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> n <span class="sy1"><</span> <span class="nu0">10000</span><span class="sy4">;</span> <span class="sy2">++</span>n<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="sy2">++</span>hist<span class="br0">[</span><a href="cpp-numeric-math-round.html"><span class="kw1353">std::<span class="me2">round</span></span></a><span class="br0">(</span>normal_dist<span class="br0">(</span>e2<span class="br0">)</span><span class="br0">)</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Normal distribution around "</span> <span class="sy1"><<</span> mean <span class="sy1"><<</span> <span class="st0">":<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> p <span class="sy4">:</span> hist<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-fixed.html"><span class="kw1783">std::<span class="me2">fixed</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-setprecision.html"><span class="kw1795">std::<span class="me2">setprecision</span></span></a><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span> <span class="sy1"><<</span> <a href="cpp-io-manip-setw.html"><span class="kw1796">std::<span class="me2">setw</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span>
|
|
<span class="sy1"><<</span> p.<span class="me1">first</span> <span class="sy1"><<</span> <span class="st0">' '</span> <span class="sy1"><<</span> <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="br0">(</span>p.<span class="me1">second</span><span class="sy2">/</span><span class="nu0">200</span>, <span class="st0">'*'</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">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</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|