2014-04-16 48 views
1

我有一個Java程序,生成一個浮點值侵略性可以從0到無限。我需要做的是這個浮點數越高,程序觸發功能的機會越高attackPawn()如何將從0到無限的值限制爲從0到1的值?

我已經發現我需要函數Math.random(),它給出一個介於0和1之間的隨機值。如果Math.random()低於攻擊性轉換爲介於0和1之間的float,我打電話功能attackPawn()

但是現在我被卡住了,我無法弄清楚如何將侵略性從0變爲無限到0到1的浮點數,1表示「無限」侵略性,0表示沒有憤怒。

任何想法或數學方程?預先感謝您

+1

作爲無限爲有限真的(至少在目前使用的硬件),你可以簡單地通過劃分侵略性Float.MAXVALUE。 –

+2

@DirkLachowski這是一個非常有限的方法,因爲存在針對此問題的雙射。 tan(x * pi/2) –

+0

這將是非常有用的,如果你發佈一些代碼,無論你嘗試過什麼.. – TechSpellBound

回答

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); 

有選項的無限數量。只需選擇一個適合您的需求。

+0

這似乎是我正在尋找!非常感謝 ! – turbodoom

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) 
0

試着改造侵略性與像一個函數:

public float function(float aggressiveness) { 
    if(aggressiveness > 0F) { 
     return 1 - (1/aggressiveness); 
    } 
    return 0F; 
} 

這會將值映射到0°的範圍內,1);

2

可以將[0,無窮大]映射到[0,1),但這不是線性的。一個例子功能是:

y = tan(x * pi/2); 

具有這種功能的問題是,你不能讓從一個正確的計算機程序,因爲它是不可能的(或容易)首先計算像10^5000一個真正的大和號將其映射到[0,1)

但是一個更好的解決辦法是你的定義修改爲類似的東西:

0 = no aggression 
1 = maximum aggression 

有了這個,你不必

0

雖然雙級支持無限價值double d=Double.POSITIVE_INFINITY但我的數字地圖不認爲你可以用它來達到你的算術目的。最好定義一個最大值並將其視爲無窮大。

double Min=0; 
double Max= Double.MAX_VALUE; 

double aggresiveness= Min + (Math.random() * ((Max - Min) + 1)); 

PS:您還可以利用強大的攻擊力爲longint,如果你不希望它是一個雙