我正在尝试根据玩家的准确性生成一个随机数。如果他的准确性更高,他的成本应该更高。
对于前,
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。
如何根据准确度生成费用?
谢谢。
答案 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)
将准确度拨到0.30,得到这个范围内的随机成本:
对于高度准确的玩家(0.99),我们得到:
扩大成本的另一种方法是使用triangular distribution,如下所示:
cost = random.triangular(0.0,max(0.01,accuracy),1.0)
这次,x轴是精度,成本y逐渐增大。请注意,高度精确的播放器仍然可以获得低成本,但低精度播放器永远不会获得高成本:
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)