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

时间:2014-04-16 09:44:42

标签: java math game-development

我有一个Java程序,它生成一个浮动值攻击性,可以从0到无限。我需要做的是,浮动越高,程序触发函数 attackPawn()的可能性就越大。

我已经发现我需要函数Math.random(),它提供0到1之间的随机值。如果Math.random()低于攻击性转换为浮点数0和1,我调用函数 attackPawn()

但是现在我被卡住了,我无法弄清楚如何将攻击性从0转换为无限到从0到1的浮点数,1意味着“无限”的攻击性和0意义没有愤怒。

任何想法或数学等式?提前谢谢

5 个答案:

答案 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:如果您不希望它成为双重身份,您也可以将longint视为攻击性