擅长:python、mysql、java
<p>我曾经发布过<a href="https://stackoverflow.com/questions/12358968/how-do-i-generate-random-letters-in-java-based-on-probability/12359384#12359384">an answer to a similar question</a>(尽管是用Java编写的),其中有人想用不同的概率选择字母表中的字母。你可以采取我在那里建议的任何一种方法。在</p>
<p>最普遍的方法是计算选择每个数字的概率。例如,您可能有一个元组(number,probability)的列表</p>
<pre><code>choices = [(1, 0.2), (2, 0.05), (3, 0.3113), ...]
</code></pre>
<p>然后你可以选择一个介于0和1之间的随机数,在列表中迭代,在前进的过程中把概率加起来,当你得到一个大于你选择的随机数的和时,停止并返回相应的选择。在</p>
^{pr2}$
<p>(请注意,<code>itertools.accumulate()</code>在python2中不存在,否则可以在这里使用它。)</p>
<p>如果您碰巧使用的是Numpy,那么它的内置功能是<code>numpy.random.choice(numbers, p=probabilities)</code>。在</p>
<p>如果所有的概率都是某个值的倍数,那么使用<code>random.choice()</code>可能会更好。要做到这一点,你需要创建一个没有概率的可能选择列表,重复每一个选项以得到你想要的相对比例。例如</p>
<pre><code>choices = [1, 1, 1, 2, 3, 3, 4]
</code></pre>
<p>会导致<code>1</code>的可能性是<code>2</code>或{<cd6>}的三倍,而{<cd7>}的可能性是{<cd5>}或{<cd6>}的两倍。然后每次你想掷骰子的时候只要打电话给<code>random.choice(choices)</code>。在</p>
<p>在您的情况下,第二种方法似乎非常适合,但是您可以使用任何一种方法。我将留给您来为您的案例找出<code>choices</code>的正确定义。;—)</p>