根据Python中的变量生成随机值

时间:2014-03-25 17:01:12

标签: python python-2.7

我正在尝试根据玩家的准确性生成一个随机数。如果他的准确性更高,他的成本应该更高。

对于前,

      if accuracy >= 0.9, cost = 0.7

      else if accuracy >= 0.8, cost = 0.6
      (something like this)

cost是0和user_specified_value之间的随机浮点数。如果他的准确度接近1,我希望生成的成本更接近user_specified_value。

如何根据准确度生成费用?

谢谢。

2 个答案:

答案 0 :(得分:2)

from __future__ import division ## this lets us do non integer division
import random

user_specified_value = 5

if accuracy >= 0.9:
    cost = random.randrange(user_specified_value//2,user_specified_value,1)/10
else:
    cost = random.randrange(0,user_specified_value,1)/10

因为我们导入__future__所有使用/的除法都是浮点除法。如果你想要整数除法,只需使用//。浮点除法是python 3中的默认值。

random.randrange不喜欢非整数,所以如果你想要一个十进制成本,你必须指定user_specified_value作为整数。

答案 1 :(得分:2)

我认为你要问的是从发行版中抽样。

Python的random模块提供了多种发行版,其选择取决于您对应用程序的需求。例如,random.random()返回均匀分布在0.0和1.0之间的浮点数。

均匀

您可能希望从准确度较高的频段统一抽样成本,如下所示:

cost = (random.random() * spread + min(accuracy, (1-spread))) * user_specified_value

Spread定义了波段的宽度,我们在波段内均匀绘制,向上滑动波段,因为当我们达到100%时,精度会提高停止。

让我们看看这看起来如何,生成1000个随机样本:

这里的y轴是成本。 x轴就是样本绘制的顺序,没有意义。这是你得到的低精度(0.01) accuracy=0.01

将准确度拨到0.30,得到这个范围内的随机成本: accuracy=0.30

对于高度准确的玩家(0.99),我们得到: accuracy=0.99

三角分布

扩大成本的另一种方法是使用triangular distribution,如下所示:

cost = random.triangular(0.0,max(0.01,accuracy),1.0)

这次,x轴是精度,成本y逐渐增大。请注意,高度精确的播放器仍然可以获得低成本,但低精度播放器永远不会获得高成本: triangular distribution

BTW,我使用了绘图库matplotlib和以下代码来生成这些漂亮的图。

import numpy as np
import matplotlib.pyplot as plt
import random

user_specified_value = 100.0
spread = 0.33
n = 1000

## uniform
accuracy = 0.01
costs = [0] * n
for i in range(0,n):
    costs[i] = random.random() * user_specified_value * accuracy
plt.scatter(range(0,n), costs)
plt.ylim(0, 100)

## triangular
accuracy = [0] * n
costs = [0] * n
for i in range(0,n):
    accuracy[i] = float(i)/n
    costs[i] = random.triangular(0.0,max(0.01,accuracy[i]),1.0) * user_specified_value
plt.scatter(accuracy, costs)