mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
36 lines
35 KiB
HTML
36 lines
35 KiB
HTML
<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范围内的随机整数(译者注:start,end,step都是整数,不包含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"><=</span> <span class="pre">N</span> <span class="pre"><=</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">sample(range(10000000),</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"><=</span> <span class="pre">N</span> <span class="pre"><=</span> <span class="pre">b</span></code> for <code class="docutils literal"><span class="pre">a</span> <span class="pre"><=</span> <span class="pre">b</span></code> and <code class="docutils literal"><span class="pre">b</span> <span class="pre"><=</span> <span class="pre">N</span> <span class="pre"><=</span> <span class="pre">a</span></code> for <code class="docutils literal"><span class="pre">b</span> <span class="pre"><</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"><=</span> <span class="pre">N</span> <span class="pre"><=</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">></span> <span class="pre">0</span></code> and <code class="docutils literal"><span class="pre">beta</span> <span class="pre">></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">></span> <span class="pre">0</span></code> and <code class="docutils literal"><span class="pre">beta</span> <span class="pre">></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 Twister:A 623-dimensionalionally equidistributed uniform pseudorandom number生成器”,ACM Transactions on Modeling and Computer Simulation Vol。</span><span class="yiyi-st" id="yiyi-133">8,No.</span><span class="yiyi-st" id="yiyi-134">1,January 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">>>> </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 <= x < 1.0</span>
|
||
<span class="go">0.37444887175646646</span>
|
||
|
||
<span class="gp">>>> </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 <= x < 10.0</span>
|
||
<span class="go">1.1800146073117523</span>
|
||
|
||
<span class="gp">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </span><span class="n">items</span>
|
||
<span class="go">[7, 3, 2, 5, 6, 4, 1]</span>
|
||
|
||
<span class="gp">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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> |