Java 如何将从0到无穷大的值钳制为从0到1的值?

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]的单调函数。

我有一个Java程序,它生成一个从0到无限的浮点值。我需要做的是,这个浮点值越高,程序启动函数的可能性就越高

我已经发现我需要函数Math.random(),它给出了一个介于0和1之间的随机值。如果Math.random()小于攻击性转换为介于0和1之间的浮点值,我将调用函数attackPawn()

但现在我被卡住了,我不知道如何才能将攻击性从0转化为无限,变成一个从0到1的浮动,1表示“无限”攻击性,0表示没有愤怒


有什么想法或数学方程吗?

你想要一个将[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你是对的,正确性是不需要的。但是如果问题是要满足定义的话正确性是必需的。(但最好改变定义)