我有一个Java程序,它生成一个浮动值攻击性,可以从0到无限。我需要做的是,浮动越高,程序触发函数 attackPawn()的可能性就越大。
我已经发现我需要函数Math.random(),它提供0到1之间的随机值。如果Math.random()低于攻击性转换为浮点数0和1,我调用函数 attackPawn()。
但是现在我被卡住了,我无法弄清楚如何将攻击性从0转换为无限到从0到1的浮点数,1意味着“无限”的攻击性和0意义没有愤怒。
任何想法或数学等式?提前谢谢
答案 0 :(得分:8)
你想要一个将[0 ... infinity]映射到[0..1]的单调函数。有很多选择:
y=Math.atan(x)/(Math.PI/2);
y=x/(1+x);
y=1-Math.exp(-x);
还有更多。在给定正常数k>0
:
y=Math.atan(k*x)/(Math.PI/2);
y=x/(k+x);
y=1-Math.exp(-k*x);
有无数的选择。只需选择一个适合您需求的产品。
答案 1 :(得分:2)
可以将[0,无穷大]映射到[0,1],但这不会是线性的。一个示例函数是:
y = tan(x * pi / 2);
此功能的问题在于,您无法从中创建正确的计算机程序,因为无法(或轻松)首先计算像10^5000
这样的真实大数字并将其映射到[0,1)
。
但更好的解决方案是将您的定义更改为类似的内容:
0 = no aggression
1 = maximum aggression
有了这个,你不必映射数字
答案 2 :(得分:1)
尝试这样的事情:
// aggressiveness is a float with a value between 0 and Float.MAX_VALUE or a value of Float.POSITIVE_INFINITY
if (aggressiveness == Float.POSITIVE_INFINITY) {
aggressiveness = 1f;
} else {
aggressiveness = aggressiveness / Float.MAX_VALUE;
}
// aggressiveness is now between 0 and 1 (inclusive)
答案 3 :(得分:0)
尝试使用以下函数转换攻击性
public float function(float aggressiveness) {
if(aggressiveness > 0F) {
return 1 - (1 / aggressiveness);
}
return 0F;
}
这会将您的值映射到[0,1};
的范围答案 4 :(得分:0)
虽然Double类支持无限值double d=Double.POSITIVE_INFINITY
,但我认为你不能将它用于算术目的。最好定义最大值并将其视为无穷大。
double Min=0;
double Max= Double.MAX_VALUE;
double aggresiveness= Min + (Math.random() * ((Max - Min) + 1));
ps:如果您不希望它成为双重身份,您也可以将long
或int
视为攻击性