随机量计算器

时间:2013-11-18 19:55:57

标签: python probability weighted-average

我正在试图找出一个随机数量的计算器,但很少见:

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's10应该最常见,而偶然10s在混合中时,两个100s位于那里且几乎没有任何1000值永远10000的价值。有没有办法设置执行此操作的优先级类型函数?在完成所述之后应该返回的一些很好的示例数据将是:

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

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

6 个答案:

答案 0 :(得分:4)

您的代码未分配任何概率。你可能希望1010000更少见,但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)

答案 1 :(得分:2)

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

choices = [10, 10, 10, 100]

将使得10倍于100倍。

答案 2 :(得分: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)

这会在50%的运行中输出10,在25%的运行中输出100,在15%的运行中输出1000,在10%的运行中输出10000跑步。您可以将范围自定义为您希望[10,100,1000,10000]以上的任何分布!

答案 3 :(得分: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%

你可以随心所欲地调整它,或者让范围更长,以获得更具体的机会。

答案 4 :(得分: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

答案 5 :(得分: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]

使用列表,您可以随时更改返回的实际值,因此,如果不是10,100,1000,10000,而是要返回50,500,500和50000,则可以重新分配值列表,代码仍然有效,无需通过并更改每一行。