Java 如何将从0到无穷大的值钳制为从0到1的值?
我有一个Java程序,它生成一个从0到无限的浮点值。我需要做的是,这个浮点值越高,程序启动函数的可能性就越高 我已经发现我需要函数Math.random(),它给出了一个介于0和1之间的随机值。如果Math.random()小于攻击性转换为介于0和1之间的浮点值,我将调用函数attackPawn() 但现在我被卡住了,我不知道如何才能将攻击性从0转化为无限,变成一个从0到1的浮动,1表示“无限”攻击性,0表示没有愤怒Java 如何将从0到无穷大的值钳制为从0到1的值?,java,math,game-development,Java,Math,Game Development,我有一个Java程序,它生成一个从0到无限的浮点值。我需要做的是,这个浮点值越高,程序启动函数的可能性就越高 我已经发现我需要函数Math.random(),它给出了一个介于0和1之间的随机值。如果Math.random()小于攻击性转换为介于0和1之间的浮点值,我将调用函数attackPawn() 但现在我被卡住了,我不知道如何才能将攻击性从0转化为无限,变成一个从0到1的浮动,1表示“无限”攻击性,0表示没有愤怒 有什么想法或数学方程吗?你想要一个将[0…无穷大]映射到[0…1]的单调函数。
有什么想法或数学方程吗?你想要一个将[0…无穷大]映射到[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);
有无限多的选择。只要挑一个适合你需要的就行了。试试这样的方法:
// 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)
尝试使用以下功能来转变攻击性:
public float function(float aggressiveness) {
if(aggressiveness > 0F) {
return 1 - (1 / aggressiveness);
}
return 0F;
}
这会将您的值映射到[0,1]的范围;可以将[0,无穷大)映射到[0,1],但这不是线性的。示例函数为:
y = tan(x * pi / 2);
这个函数的问题是,您无法从中生成正确的计算机程序,因为不可能(或很容易)首先计算像10^5000
这样的真正大数字,然后将其映射到[0,1)
但更好的解决方案是将您的定义更改为:
0 = no aggression
1 = maximum aggression
有了这个,你不必映射数字,尽管Double类支持无穷大
Double d=Double。正无穷大,但我认为你不能将其用于算术目的。最好定义一个最大值并将其视为无穷大
double Min=0;
double Max= Double.MAX_VALUE;
double aggresiveness= Min + (Math.random() * ((Max - Min) + 1));
ps:你也可以将攻击性作为long
或int
如果你不想它是一个双精度的,因为无穷大实际上是有限的(至少在现在使用的硬件上),你可以简单地将攻击性除以Float.MAXVALUE。@DirkLachowski这是一个非常有限的方法,因为这个问题存在双射,例如tan(x*pi/2)如果你发布一些代码,不管你尝试过什么,都会非常有帮助。@荒谬的想法是肯定的,但我不确定在游戏中攻击性度量是否需要数学正确性-对于游戏来说,它应该比精确更快…@DirkLachowski你是对的,正确性是不需要的。但是如果问题是要满足定义的话正确性是必需的。(但最好改变定义)