Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 随机量计算器_Python_Probability_Weighted Average - Fatal编程技术网

Python 随机量计算器

Python 随机量计算器,python,probability,weighted-average,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 它返回大量的值,但它们不

我试图计算出一个随机数量计算器,但以稀有性为例:

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
,当
10s
100s
最常见时,几乎没有任何
10
值,然后在混合中偶尔出现
1000
,但几乎没有10000值。有没有办法设置一个优先级类型函数来实现这一点?以下是一些很好的示例数据,说明在“完成”中所说的一切之后,应该返回什么:

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

偶尔会出现
10000
,但这应该是非常罕见的,你知道如何设置吗?

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

choices = [10, 10, 10, 100]

10的概率是100的三倍。

您可以生成一个随机数

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)
如果x<0.5:#x在0到.50之间,那么50%的几率
选择=10
否则,如果x<0.75:#x介于.50和.75之间,则75-50=25%的几率
选择=100
否则,如果x<0.9:#x介于.75和.90之间,则90-75=15%的几率
选择=1000
其他:
choice=10000#x介于.90和1之间,因此100-90=10%的概率(比第一个概率低5倍)
这将在50%的运行中输出
10
,在25%的运行中输出
100
,在15%的运行中输出
1000
,在10%的运行中输出
10000
。您可以将范围自定义为您想要的
[10100100010000]
上的任何分布

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

import random
def getAmmounts():
    choices = [10] * 80 + [100] * 15 + [1000] * 4 + [10000] * 1
    values = [random.choice(choices) for i in range(10)]
    return values

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

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%
x=randint(1,11)
如果x==10:
#这是最罕见的,发生率只有10%
如果x<10且x>=8:
#9或8或20%
如果x<8且x>=5:
#7、6、5或30%

您可以随时调整它,或使范围变长以获得更具体的机会。

您的代码不指定任何概率。您可能希望
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)
随机导入
def make_编号():
val=random.random()
如果val<0.1:#10%
返回10000
elif val<0.3:#20%
返回1000
elif val<0.6:#30%
返回100
其他:40%
返回10
值=[make_number()表示范围(10)内的i]
打印(值)
或者,如果您想使用列表,您可以这样做(我没有空闲打开,而且加载需要很长时间,所以如果我有一点空闲,我道歉。)


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

确切的常见程度(即,概率是多少)每个数字都应该是吗?@jwodder每个数字的概率不是一个精确的数字,但
10s
应该是最常见的,因此在有20个值的数据中
10
应该出现6-10次,但永远不会精确到100的值,可能是千分之三到五的一次或两次,但几乎不会出现10000次value@user2925490jwodder问什么这实际上是对总体解决方案的暗示。您希望为这些值分配概率,例如,
10
在80%的时间内出现,
100
在10%的时间内出现,
1000
在8%的时间内出现,
10000
在2%的时间内出现。但是,在为其分配实际百分比时,请记住
getAmounts()
将实时运行多少次,这样,如果用户可以在每一次实现中在一分钟内运行
getAmounts()
1000次,那么
10000
仍然是一个罕见的数字(一次或两次)。这将需要prob/stats数学。还需要重复、、和可能几十个其他问题。@user2925490除了我刚才说的,你说你希望
10
出现
20次中的6次。将其重新调整为一个统计问题,请注意,
6/20
可以表示为百分比(
(6/20)*100=30%!
)这在技术上是一个解决方案,但实际上是一个混乱的解决方案,无法真正扩展到任何应用程序。把时间花在学习基于统计的答案上会有用得多。因此我的“快速但不是最好的”。我不知道OP需要一个多么灵活的解决方案。完全正确,我正在审查所有这些解决方案,看看我们能让OP使用的直接实现有多接近;越直接,它可能(越难)越好。像这样手动调整概率是一个很好的开始,但是当你的实现规模向上一点时,我会变得一团糟。从长远来看,研究概率/统计(非常基本的版本)更有用,以了解如何让计算机按比例为您生成。此解决方案比Jud或triplee的更优雅,因为他们让您手动添加所需概率的条目,这将使用一个范围为您完成。它没有直接实现那么优雅,但我会选择它,而不是我见过的任何其他东西。如果我理解正确,每个elif行的第一部分都是多余的,因为如果上面的If/elif为真,则不会查看elif。如果x=
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
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]