2

我正在尝试找出一个随机数量的计算器,但很罕见,例如:

choices = [10,100,1000,10000]

10是最常见的、100更常见的、1000罕见的和10000极其罕见的

我试过这个

import random
def getAmmounts():
    choices = [10, 100, 1000, 10000]
    values = [random.choice(choices) for i in range(10)]
    return values

它返回了大量的值,但是10000当我调用它时它几乎不应该出现时,它们并不经常出现,我收到的数据是:

[1000, 10000, 100, 1000, 10000, 10, 1000, 10000, 100, 100]

有两个10000's在那里,几乎没有任何10值,什么时候10s应该100s是最常见的,然后是偶尔1000出现的,但几乎没有 10000 的值。有没有办法设置一个优先类型的函数来做到这一点?在完成后应该返回的一些很好的示例数据是:

[10,10,100,10,10,100,1000]

偶尔10000但应该非常罕见,关于如何设置的任何想法?

4

6 回答 6

4

您的代码没有分配任何概率。你可能打算10少一些,10000但 Python 不会知道这一点。

您可以使用 random.random 模拟概率以生成介于 0 和 1 之间的随机数,并根据生成的数字返回适当的数字。

例如

import random

def make_number():
  val = random.random()
  if val < 0.1: #10%
    return 10000
  elif val < 0.3: # 20%
    return 1000
  elif val < 0.6: # 30%
    return 100
  else: # 40%
    return 10

values = [make_number() for i in range(10)]
print (values)
于 2013-11-18T20:06:44.490 回答
2

输入列表对每个项目获得相等的概率。用你想要的比例给它一个列表。

choices = [10, 10, 10, 100]

10 的可能性是 100 的三倍。

于 2013-11-18T20:03:04.320 回答
2

你可以产生一个随机数

import random
x = random.random() % this produces a random number between 0 and 1

您可以使用随机生成的数字在 10、100、1000 和 10000 之间进行选择:

if x < 0.5:        # x is between 0 and .50, so 50% chance
    choice = 10
else if x < 0.75:  # x is between .50 and .75, so 75-50 = 25% chance
    choice = 100
else if x < 0.9:   # x is between .75 and .90, so 90-75 = 15% chance
    choice = 1000
else:
    choice = 10000 # x is between .90 and 1, so 100-90 = 10% chance (5 times less likely than the first one)

10在 50% 的运行、100​​25% 的运行、1000​​15% 的运行和1000010% 的运行上输出。您可以将范围自定义为您想要的任何分布[10,100,1000,10000]

于 2013-11-18T20:03:09.280 回答
2

为什么不生成一个数字,然后根据范围分配:

x = randint(1,11)
if x == 10:
    #This is the rarest, occurring only 10% of the time
elif x < 10 and x >= 8:
    #9 or 8 aka 20%
elif x < 8 and x >= 5:
    #7, 6, 5 aka 30%

您可以随心所欲地对其进行调整,或者使范围更长以获得更具体的机会。

于 2013-11-18T20:06:17.390 回答
0

一个快速(尽管不一定是最好的)解决方案是将您希望在列表中更频繁地出现的数字的多个副本粘贴:

import random
def getAmmounts():
    choices = [10] * 80 + [100] * 15 + [1000] * 4 + [10000] * 1
    values = [random.choice(choices) for i in range(10)]
    return values
于 2013-11-18T20:04:09.173 回答
0
import random

def getAmounts():
  amount = random.random(1,10)
  if amount == 10:
    return 10000
  elif amount > 8:
    return 1000
  elif amount > 5:
    return 100
  else:
    return 10

或者,如果你想使用一个列表,你可以做类似的事情(我没有打开 IDLE,加载需要很长时间,所以如果我有点走神,我很抱歉。)

import random

def getAmounts():
    values = [10, 100, 1000, 10000]
    amount = random.random(1,10)
    if amount == 10:
        return values[3]
    elif amount > 8:
        return values[2]
    elif amount > 5:
    return values [1]
  else:
    return values[0]

使用列表,您始终可以更改返回的实际值,因此如果您想要返回 50、500、5000 和 50000 而不是 10、100、1000、10000,您只需重新分配值列表,代码仍然有效,而不必遍历和更改每一行。

于 2013-11-18T20:23:37.540 回答