uTools-Manuals/docs/python/random.html
2019-04-21 11:50:48 +08:00

36 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-random"><h1><span class="yiyi-st" id="yiyi-10">9.6. <a class="reference internal" href="#module-random" title="random: Generate pseudo-random numbers with various common distributions."><code class="xref py py-mod docutils literal"><span class="pre">random</span></code></a> - 生成伪随机数字</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/random.py">Lib / random.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">这个模块实现了对各种分布的伪随机数发生器。</span></p><p><span class="yiyi-st" id="yiyi-13">对于整数,有一个范围的均匀选择。</span><span class="yiyi-st" id="yiyi-14">对于序列,存在随机元素的均匀选择,产生就地列表的随机置换的函数,以及用于无替换的随机采样的函数。</span></p><p><span class="yiyi-st" id="yiyi-15">实际上,存在计算均匀,正态(高斯),对数正态,负指数,伽马和β分布的函数。</span><span class="yiyi-st" id="yiyi-16">为了生成角度分布可以使用von Mises分布。</span></p><p><span class="yiyi-st" id="yiyi-17">几乎所有模块函数都依赖于基本函数<a class="reference internal" href="#random.random" title="random.random"><code class="xref py py-func docutils literal"><span class="pre">random()</span></code></a>,其在半开放范围[0.0,1.0)中均匀地生成随机浮点数。</span><span class="yiyi-st" id="yiyi-18">Python使用Mersenne Twister作为核心生成器。</span><span class="yiyi-st" id="yiyi-19">它产生53位精确度浮点数周期为2 ** 19937-1。</span><span class="yiyi-st" id="yiyi-20">C中的底层实现既快又线程安全。</span><span class="yiyi-st" id="yiyi-21">Mersenne Twister是现存最广泛测试的随机数生成器之一。</span><span class="yiyi-st" id="yiyi-22">然而,完全确定性,它不适合于所有目的,并且完全不适合于加密目的。</span></p><p><span class="yiyi-st" id="yiyi-23">该模块提供的函数实际上是<code class="xref py py-class docutils literal"><span class="pre">random.Random</span></code>类的隐藏实例的约束方法。</span><span class="yiyi-st" id="yiyi-24">您可以实例化您自己的<code class="xref py py-class docutils literal"><span class="pre">Random</span></code>实例,以获得不共享状态的生成器。</span></p><p><span class="yiyi-st" id="yiyi-25">如果你想使用你自己设计的不同的基本生成器,类<code class="xref py py-class docutils literal"><span class="pre">Random</span></code>也可以是子类:在这种情况下,覆盖<code class="xref py py-meth docutils literal"><span class="pre">random()</span></code><code class="xref py py-meth docutils literal"><span class="pre">seed()</span></code><code class="xref py py-meth docutils literal"><span class="pre">getstate()</span></code><code class="xref py py-meth docutils literal"><span class="pre">setstate()</span></code>方法。</span><span class="yiyi-st" id="yiyi-26">可选地,新的生成器可以提供<code class="xref py py-meth docutils literal"><span class="pre">getrandbits()</span></code>方法 - 这允许<a class="reference internal" href="#random.randrange" title="random.randrange"><code class="xref py py-meth docutils literal"><span class="pre">randrange()</span></code></a>在任意大的范围上产生选择。</span></p><p><span class="yiyi-st" id="yiyi-27"><a class="reference internal" href="#module-random" title="random: Generate pseudo-random numbers with various common distributions."><code class="xref py py-mod docutils literal"><span class="pre">random</span></code></a>模块还提供<a class="reference internal" href="#random.SystemRandom" title="random.SystemRandom"><code class="xref py py-class docutils literal"><span class="pre">SystemRandom</span></code></a>类,它使用系统函数<a class="reference internal" href="os.html#os.urandom" title="os.urandom"><code class="xref py py-func docutils literal"><span class="pre">os.urandom()</span></code></a>从操作系统提供的源生成随机数。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-28">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-29">该模块的伪随机生成器不应该用于安全目的。</span></p></div><p><span class="yiyi-st" id="yiyi-30">记账功能:</span></p><dl class="function"><dt id="random.seed"><span class="yiyi-st" id="yiyi-31"><code class="descclassname">random.</code><code class="descname">seed</code><span class="sig-paren">(</span><em>a=None</em>, <em>version=2</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">初始化生成器的随机数。</span></p><p><span class="yiyi-st" id="yiyi-33">如果省略<em>a</em><code class="docutils literal"><span class="pre">None</span></code>,则使用当前系统时间。</span><span class="yiyi-st" id="yiyi-34">如果随机源由操作系统提供,则使用它们而不是系统时间(有关可用性的详细信息,请参阅<a class="reference internal" href="os.html#os.urandom" title="os.urandom"><code class="xref py py-func docutils literal"><span class="pre">os.urandom()</span></code></a>函数)。</span></p><p><span class="yiyi-st" id="yiyi-35">如果<em>a</em>是一个int它直接使用。</span></p><p><span class="yiyi-st" id="yiyi-36">对于版本2默认值<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a><a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a><a class="reference internal" href="functions.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal"><span class="pre">bytearray</span></code></a>对象将转换为<a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal"><span class="pre">int</span></code></a>使用其所有位。</span><span class="yiyi-st" id="yiyi-37">在版本1中使用<em>a</em><a class="reference internal" href="functions.html#hash" title="hash"><code class="xref py py-func docutils literal"><span class="pre">hash()</span></code></a></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-38"><span class="versionmodified">在版本3.2中更改:</span>移动到使用字符串种子中的所有位的版本2方案。</span></p></div></dd></dl><dl class="function"><dt id="random.getstate"><span class="yiyi-st" id="yiyi-39"><code class="descclassname">random.</code><code class="descname">getstate</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">返回捕获生成器的当前内部状态的对象。</span><span class="yiyi-st" id="yiyi-41">此对象可以传递到<a class="reference internal" href="#random.setstate" title="random.setstate"><code class="xref py py-func docutils literal"><span class="pre">setstate()</span></code></a>以恢复状态。</span></p></dd></dl><dl class="function"><dt id="random.setstate"><span class="yiyi-st" id="yiyi-42"><code class="descclassname">random.</code><code class="descname">setstate</code><span class="sig-paren">(</span><em>state</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43"><em>状态</em>应该从先前对<a class="reference internal" href="#random.getstate" title="random.getstate"><code class="xref py py-func docutils literal"><span class="pre">getstate()</span></code></a>的调用获得,并且<a class="reference internal" href="#random.setstate" title="random.setstate"><code class="xref py py-func docutils literal"><span class="pre">setstate()</span></code></a>将生成器的内部状态恢复为是在当时<a class="reference internal" href="#random.getstate" title="random.getstate"><code class="xref py py-func docutils literal"><span class="pre">getstate()</span></code></a>被调用。</span></p></dd></dl><dl class="function"><dt id="random.getrandbits"><span class="yiyi-st" id="yiyi-44"><code class="descclassname">random.</code><code class="descname">getrandbits</code><span class="sig-paren">(</span><em>k</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-45">返回一个 <em>k</em> 位(bit) 的随机整数(译者注如k=8,返回8bit范围内的随机数即0-255的随机数)</span><span class="yiyi-st" id="yiyi-46">该方法与MersenneTwister生成器一起提供并且一些其他生成器也可以将其提供为API的可选部分。</span><span class="yiyi-st" id="yiyi-47">当可用时,<a class="reference internal" href="#random.getrandbits" title="random.getrandbits"><code class="xref py py-meth docutils literal"><span class="pre">getrandbits()</span></code></a>启用<a class="reference internal" href="#random.randrange" title="random.randrange"><code class="xref py py-meth docutils literal"><span class="pre">randrange()</span></code></a>以处理任意大的范围。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-48">整数的函数:</span></p><dl class="function"><dt id="random.randrange"><span class="yiyi-st" id="yiyi-49"><code class="descclassname">random.</code><code class="descname">randrange</code><span class="sig-paren">(</span><em>stop</em><span class="sig-paren">)</span></span></dt><dt><span class="yiyi-st" id="yiyi-50"><code class="descclassname">random.</code><code class="descname">randrange</code><span class="sig-paren">(</span><em>start</em>, <em>stop</em><span class="optional">[</span>, <em>step</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-51"><code class="docutils literal"><span class="pre">range(start,</span> <span class="pre">stop,</span> <span class="pre">step)</span></code>返回一个start到end范围内的随机整数译者注startendstep都是整数不包含end可以指定step。</span><span class="yiyi-st" id="yiyi-52">这等同于<code class="docutils literal"><span class="pre">choice(range(start,</span> <span class="pre">stop,</span> <span class="pre">step))</span></code>,但实际上没有编译range对象。</span></p><p><span class="yiyi-st" id="yiyi-53">位置参数模式与<a class="reference internal" href="stdtypes.html#range" title="range"><code class="xref py py-func docutils literal"><span class="pre">range()</span></code></a>匹配。</span><span class="yiyi-st" id="yiyi-54">不应使用关键字参数,因为函数可能以意想不到的方式使用它们。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-55"><span class="versionmodified">在版本3.2中更改:</span> <a class="reference internal" href="#random.randrange" title="random.randrange"><code class="xref py py-meth docutils literal"><span class="pre">randrange()</span></code></a>更复杂地生成平均分布的值。</span><span class="yiyi-st" id="yiyi-56">以前,它使用类似<code class="docutils literal"><span class="pre">int(random()*n)</span></code>这样可能产生轻微的不均匀分布。</span></p></div></dd></dl><dl class="function"><dt id="random.randint"><span class="yiyi-st" id="yiyi-57"><code class="descclassname">random.</code><code class="descname">randint</code><span class="sig-paren">(</span><em>a</em>, <em>b</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">返回一个随机整数<em>N</em><code class="docutils literal"><span class="pre">a</span> <span class="pre">&lt;=</span> <span class="pre">N</span> <span class="pre">&lt;=</span> <span class="pre">b</span></code><code class="docutils literal"><span class="pre">randrange(a,</span> <span class="pre">b+1)</span></code>的别名。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-59">序列函数:</span></p><dl class="function"><dt id="random.choice"><span class="yiyi-st" id="yiyi-60"><code class="descclassname">random.</code><code class="descname">choice</code><span class="sig-paren">(</span><em>seq</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-61">从非空序列<em>seq</em>返回一个随机元素。</span><span class="yiyi-st" id="yiyi-62">如果<em>seq</em>为空,则引发<a class="reference internal" href="exceptions.html#IndexError" title="IndexError"><code class="xref py py-exc docutils literal"><span class="pre">IndexError</span></code></a></span></p></dd></dl><dl class="function"><dt id="random.shuffle"><span class="yiyi-st" id="yiyi-63"><code class="descclassname">random.</code><code class="descname">shuffle</code><span class="sig-paren">(</span><em>x</em><span class="optional">[</span>, <em>random</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-64">原地搅乱序列<em>x</em></span><span class="yiyi-st" id="yiyi-65">可选参数<em>random</em>是一个具有0个参数的函数返回一个[0.0, 1.0)之间的随机浮点数;默认情况下为函数<a class="reference internal" href="#random.random" title="random.random"><code class="xref py py-func docutils literal"><span class="pre">random()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-66">注意,即使对于相当小的<code class="docutils literal"><span class="pre">len(x)</span></code><em>x</em>的排列的总数大于大多数随机数生成器的周期;这意味着长序列的大多数排列永远不会生成。</span></p></dd></dl><dl class="function"><dt id="random.sample"><span class="yiyi-st" id="yiyi-67"><code class="descclassname">random.</code><code class="descname">sample</code><span class="sig-paren">(</span><em>population</em>, <em>k</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-68">返回从群体序列或集合中选择的唯一元素的<em>k</em>长度列表。</span><span class="yiyi-st" id="yiyi-69">用于随机抽样,无需更换。</span></p><p><span class="yiyi-st" id="yiyi-70">返回包含来自总体的元素的新列表,而保持原始填充值不变。</span><span class="yiyi-st" id="yiyi-71">结果列表以选择顺序,使得所有子片段也将是有效的随机样本。</span><span class="yiyi-st" id="yiyi-72">这允许抽奖获奖者(样本)被分成大奖和第二名获奖者(子分类)。</span></p><p><span class="yiyi-st" id="yiyi-73">群体的成员不需要<a class="reference internal" href="../glossary.html#term-hashable"><span class="xref std std-term">hashable</span></a>或唯一的。</span><span class="yiyi-st" id="yiyi-74">如果群体包含重复,则每次出现是样品中的可能选择。</span></p><p><span class="yiyi-st" id="yiyi-75">要从整数范围中选择样本,请使用<a class="reference internal" href="stdtypes.html#range" title="range"><code class="xref py py-func docutils literal"><span class="pre">range()</span></code></a>对象作为参数。</span><span class="yiyi-st" id="yiyi-76">这对于从大群体采样是特别快速和节省空间的:<code class="docutils literal"><span class="pre">samplerange10000000</span> <span class="pre">60</span></code></span></p><p><span class="yiyi-st" id="yiyi-77">如果样本大小大于总体大小,则会引发<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a></span></p></dd></dl><p><span class="yiyi-st" id="yiyi-78">以下函数生成特定的实值分布。</span><span class="yiyi-st" id="yiyi-79">函数参数以分布方程中的相应变量命名,如在常见的数学实践中使用的;大多数这些方程可以在任何统计文本中找到。</span></p><dl class="function"><dt id="random.random"><span class="yiyi-st" id="yiyi-80"><code class="descclassname">random.</code><code class="descname">random</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-81">返回下一个在范围 [0.0, 1.0) 中的随机浮点数。</span></p></dd></dl><dl class="function"><dt id="random.uniform"><span class="yiyi-st" id="yiyi-82"><code class="descclassname">random.</code><code class="descname">uniform</code><span class="sig-paren">(</span><em>a</em>, <em>b</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">Return a random floating point number <em>N</em> such that <code class="docutils literal"><span class="pre">a</span> <span class="pre">&lt;=</span> <span class="pre">N</span> <span class="pre">&lt;=</span> <span class="pre">b</span></code> for <code class="docutils literal"><span class="pre">a</span> <span class="pre">&lt;=</span> <span class="pre">b</span></code> and <code class="docutils literal"><span class="pre">b</span> <span class="pre">&lt;=</span> <span class="pre">N</span> <span class="pre">&lt;=</span> <span class="pre">a</span></code> for <code class="docutils literal"><span class="pre">b</span> <span class="pre">&lt;</span> <span class="pre">a</span></code>.</span></p><p><span class="yiyi-st" id="yiyi-84">根据等式<code class="docutils literal"><span class="pre">a</span> <span class="pre">+</span>中的浮点舍入,端点值<code class="docutils literal"><span class="pre">b</span></code> <span class="pre">ba</span> <span class="pre">*</span> <span class="pre">random()</span></code></span></p></dd></dl><dl class="function"><dt id="random.triangular"><span class="yiyi-st" id="yiyi-85"><code class="descclassname">random.</code><code class="descname">triangular</code><span class="sig-paren">(</span><em>low</em>, <em>high</em>, <em>mode</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-86">返回随机浮点数 <em>N</em> 使得 <code class="docutils literal"><span class="pre">low</span> <span class="pre">&lt;=</span> <span class="pre">N</span> <span class="pre">&lt;=</span> <span class="pre">high.</span></code> 返回遵循在low和hagh之间的特定 <em>模式</em>.
</span><span class="yiyi-st" id="yiyi-87"><em></em><em></em>边界默认为零和一。</span><span class="yiyi-st" id="yiyi-88"><em>模式</em>参数默认为边界之间的中点,给出对称分布。</span></p></dd></dl><dl class="function"><dt id="random.betavariate"><span class="yiyi-st" id="yiyi-89"><code class="descclassname">random.</code><code class="descname">betavariate</code><span class="sig-paren">(</span><em>alpha</em>, <em>beta</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-90">Beta分布。</span><span class="yiyi-st" id="yiyi-91">Conditions on the parameters are <code class="docutils literal"><span class="pre">alpha</span> <span class="pre">&gt;</span> <span class="pre">0</span></code> and <code class="docutils literal"><span class="pre">beta</span> <span class="pre">&gt;</span> <span class="pre">0</span></code>. </span><span class="yiyi-st" id="yiyi-92">返回值的范围为0到1。</span></p></dd></dl><dl class="function"><dt id="random.expovariate"><span class="yiyi-st" id="yiyi-93"><code class="descclassname">random.</code><code class="descname">expovariate</code><span class="sig-paren">(</span><em>lambd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-94">指数分布。</span><span class="yiyi-st" id="yiyi-95"><em>lambd</em>为1.0除以所需平均值。</span><span class="yiyi-st" id="yiyi-96">它应该是非零的。</span><span class="yiyi-st" id="yiyi-97">该参数将被称为“lambda”但这是Python中的保留字。</span><span class="yiyi-st" id="yiyi-98">如果<em>lambd</em>为正返回值的范围为0到正无穷大如果<em>lambd</em>为负则从负无穷大到0。</span></p></dd></dl><dl class="function"><dt id="random.gammavariate"><span class="yiyi-st" id="yiyi-99"><code class="descclassname">random.</code><code class="descname">gammavariate</code><span class="sig-paren">(</span><em>alpha</em>, <em>beta</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-100">伽玛分布。</span><span class="yiyi-st" id="yiyi-101"><em>不是</em>伽玛函数!)</span><span class="yiyi-st" id="yiyi-102">Conditions on the parameters are <code class="docutils literal"><span class="pre">alpha</span> <span class="pre">&gt;</span> <span class="pre">0</span></code> and <code class="docutils literal"><span class="pre">beta</span> <span class="pre">&gt;</span> <span class="pre">0</span></code>.</span></p><p><span class="yiyi-st" id="yiyi-103">概率分布函数为:</span></p><pre><code class="language-python"><span></span> <span class="n">x</span> <span class="o">**</span> <span class="p">(</span><span class="n">alpha</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">x</span> <span class="o">/</span> <span class="n">beta</span><span class="p">)</span>
<span class="n">pdf</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="o">--------------------------------------</span>
<span class="n">math</span><span class="o">.</span><span class="n">gamma</span><span class="p">(</span><span class="n">alpha</span><span class="p">)</span> <span class="o">*</span> <span class="n">beta</span> <span class="o">**</span> <span class="n">alpha</span>
</code></pre></dd></dl><dl class="function"><dt id="random.gauss"><span class="yiyi-st" id="yiyi-104"><code class="descclassname">random.</code><code class="descname">gauss</code><span class="sig-paren">(</span><em>mu</em>, <em>sigma</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-105">高斯分布。</span><span class="yiyi-st" id="yiyi-106"><em>mu</em>是平均值,<em>sigma</em>是标准偏差。</span><span class="yiyi-st" id="yiyi-107">这稍微快于下面定义的<a class="reference internal" href="#random.normalvariate" title="random.normalvariate"><code class="xref py py-func docutils literal"><span class="pre">normalvariate()</span></code></a>函数。</span></p></dd></dl><dl class="function"><dt id="random.lognormvariate"><span class="yiyi-st" id="yiyi-108"><code class="descclassname">random.</code><code class="descname">lognormvariate</code><span class="sig-paren">(</span><em>mu</em>, <em>sigma</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-109">对数正态分布。</span><span class="yiyi-st" id="yiyi-110">如果采用此分布的自然对数,您将得到平均值<em>mu</em>和标准偏差<em>sigma</em>的正态分布。</span><span class="yiyi-st" id="yiyi-111"><em>mu</em>可以具有任何值,并且<em>sigma</em>必须大于零。</span></p></dd></dl><dl class="function"><dt id="random.normalvariate"><span class="yiyi-st" id="yiyi-112"><code class="descclassname">random.</code><code class="descname">normalvariate</code><span class="sig-paren">(</span><em>mu</em>, <em>sigma</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-113">正态分布。</span><span class="yiyi-st" id="yiyi-114"><em>mu</em>是平均值,<em>sigma</em>是标准偏差。</span></p></dd></dl><dl class="function"><dt id="random.vonmisesvariate"><span class="yiyi-st" id="yiyi-115"><code class="descclassname">random.</code><code class="descname">vonmisesvariate</code><span class="sig-paren">(</span><em>mu</em>, <em>kappa</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-116"><em>mu</em> is the mean angle, expressed in radians between 0 and 2*<em>pi</em>, and <em>kappa</em> is the concentration parameter, which must be greater than or equal to zero. </span><span class="yiyi-st" id="yiyi-117">If <em>kappa</em> is equal to zero, this distribution reduces to a uniform random angle over the range 0 to 2*<em>pi</em>.</span></p></dd></dl><dl class="function"><dt id="random.paretovariate"><span class="yiyi-st" id="yiyi-118"><code class="descclassname">random.</code><code class="descname">paretovariate</code><span class="sig-paren">(</span><em>alpha</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-119">帕累托分布。</span><span class="yiyi-st" id="yiyi-120"><em>alpha</em>是形状参数。</span></p></dd></dl><dl class="function"><dt id="random.weibullvariate"><span class="yiyi-st" id="yiyi-121"><code class="descclassname">random.</code><code class="descname">weibullvariate</code><span class="sig-paren">(</span><em>alpha</em>, <em>beta</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-122">Weibull分布。</span><span class="yiyi-st" id="yiyi-123"><em>alpha</em>是缩放参数,<em>beta</em>是形状参数。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-124">替代生成器:</span></p><dl class="class"><dt id="random.SystemRandom"><span class="yiyi-st" id="yiyi-125"> <em class="property">class </em><code class="descclassname">random.</code><code class="descname">SystemRandom</code><span class="sig-paren">(</span><span class="optional">[</span><em>seed</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-126">使用<a class="reference internal" href="os.html#os.urandom" title="os.urandom"><code class="xref py py-func docutils literal"><span class="pre">os.urandom()</span></code></a>函数从操作系统提供的源生成随机数的类。</span><span class="yiyi-st" id="yiyi-127">不适用于所有系统。</span><span class="yiyi-st" id="yiyi-128">不依赖于软件状态,序列不可重现。</span><span class="yiyi-st" id="yiyi-129">因此,<a class="reference internal" href="#random.seed" title="random.seed"><code class="xref py py-meth docutils literal"><span class="pre">seed()</span></code></a>方法没有效果,并被忽略。</span><span class="yiyi-st" id="yiyi-130">如果调用<a class="reference internal" href="#random.getstate" title="random.getstate"><code class="xref py py-meth docutils literal"><span class="pre">getstate()</span></code></a><a class="reference internal" href="#random.setstate" title="random.setstate"><code class="xref py py-meth docutils literal"><span class="pre">setstate()</span></code></a>方法引发<a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal"><span class="pre">NotImplementedError</span></code></a></span></p></dd></dl><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-131">也可以看看</span></p><p><span class="yiyi-st" id="yiyi-132">M. Matsumoto和T.Nishimura“Mersenne TwisterA 623-dimensionalionally equidistributed uniform pseudorandom number生成器”ACM Transactions on Modeling and Computer Simulation Vol。</span><span class="yiyi-st" id="yiyi-133">8No.</span><span class="yiyi-st" id="yiyi-134">1January pp.3-30 1998。</span></p><p class="last"><span class="yiyi-st" id="yiyi-135"><a class="reference external" href="https://code.activestate.com/recipes/576707/">互补 - 乘法配方</a>用于具有长期和相对简单的更新操作的兼容的替代随机数生成器。</span></p></div><div class="section" id="notes-on-reproducibility"><h2><span class="yiyi-st" id="yiyi-136">9.6.1.</span><span class="yiyi-st" id="yiyi-137">重现性注释</span></h2><p><span class="yiyi-st" id="yiyi-138">有时,能够再现由伪随机数生成器给出的序列是有用的。</span><span class="yiyi-st" id="yiyi-139">通过重新使用种子值,只要多个线程不运行,相同的序列应该从运行重现到运行。</span></p><p><span class="yiyi-st" id="yiyi-140">大多数随机模块的算法和种子函数可能会在Python版本中发生更改但两个方面保证不会更改</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-141">如果添加新的播种方法,则将提供向后兼容的播种器。</span></li><li><span class="yiyi-st" id="yiyi-142">当兼容播种机被给予相同的种子时,生成器的<code class="xref py py-meth docutils literal"><span class="pre">random()</span></code>方法将继续产生相同的序列。</span></li></ul></div><div class="section" id="examples-and-recipes"><h2><span class="yiyi-st" id="yiyi-143">9.6.2.</span><span class="yiyi-st" id="yiyi-144">示例和配方</span></h2><p><span class="yiyi-st" id="yiyi-145">基本用法:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="c1"># Random float x, 0.0 &lt;= x &lt; 1.0</span>
<span class="go">0.37444887175646646</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1"># Random float x, 1.0 &lt;= x &lt; 10.0</span>
<span class="go">1.1800146073117523</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># Integer from 0 to 9</span>
<span class="go">7</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># Even integer from 0 to 100</span>
<span class="go">26</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="s1">'abcdefghij'</span><span class="p">)</span> <span class="c1"># Single random element</span>
<span class="go">'c'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">items</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">shuffle</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">items</span>
<span class="go">[7, 3, 2, 5, 6, 4, 1]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">sample</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span> <span class="mi">3</span><span class="p">)</span> <span class="c1"># Three samples without replacement</span>
<span class="go">[4, 1, 5]</span>
</code></pre><p><span class="yiyi-st" id="yiyi-146">一个常见的任务是使用加权概率生成<a class="reference internal" href="#random.choice" title="random.choice"><code class="xref py py-func docutils literal"><span class="pre">random.choice()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-147">如果权重是小整数比,一个简单的技术是构建具有重复的样本总体:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">weighted_choices</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">'Red'</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">'Blue'</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">'Yellow'</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">'Green'</span><span class="p">,</span> <span class="mi">4</span><span class="p">)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">population</span> <span class="o">=</span> <span class="p">[</span><span class="n">val</span> <span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">cnt</span> <span class="ow">in</span> <span class="n">weighted_choices</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cnt</span><span class="p">)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">population</span><span class="p">)</span>
<span class="go">'Green'</span>
</code></pre><p><span class="yiyi-st" id="yiyi-148">更一般的方法是使用<a class="reference internal" href="itertools.html#itertools.accumulate" title="itertools.accumulate"><code class="xref py py-func docutils literal"><span class="pre">itertools.accumulate()</span></code></a>在累积分布中排列权重,然后使用<a class="reference internal" href="bisect.html#bisect.bisect" title="bisect.bisect"><code class="xref py py-func docutils literal"><span class="pre">bisect.bisect()</span></code></a>定位随机值:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">choices</span><span class="p">,</span> <span class="n">weights</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">weighted_choices</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">cumdist</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">itertools</span><span class="o">.</span><span class="n">accumulate</span><span class="p">(</span><span class="n">weights</span><span class="p">))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o">*</span> <span class="n">cumdist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">choices</span><span class="p">[</span><span class="n">bisect</span><span class="o">.</span><span class="n">bisect</span><span class="p">(</span><span class="n">cumdist</span><span class="p">,</span> <span class="n">x</span><span class="p">)]</span>
<span class="go">'Blue'</span>
</code></pre></div></div></div>