2017-01-04 25 views
0

我有一個字符年齡在幾個月的浮點數,以及具有平均身高數據的數組。使用身高數據隨機生成高度

float characterAge; 
private float[,] ageHeightData = new float[217, 10] { 180.5f,149.7416f,151.2611f,153.604f,157.5271f,161.898f,166.2812f,170.2366f,172.6084f,174.1505f }, 
... 

我想根據年齡隨機生成角色的高度。我正在使用這些來自疾病預防控制中心的年齡平均身高的圖表:here

圖表將高度降低到百分位數。

因此,對於老化的字符:180.5個月(15.5 y)時,它們的高度的平均值(以cm)被顯示爲這樣:

149.7416(3位數) 151.2611(5百分位) 153.604(10百分點) 157.5271(25百分位數) 161.898(第50百分位) 166.2812(75百分位數) 170.2366(90百分位數) 172.6084(95百分位數) 174.1505(97百分位數)

所以,161.898是真正的「平均「,149短,174是高大的,等等。 我想知道的是如何使用角色的已知年齡和這些數據以相對正確加權的方式隨機生成數字,以便如果我生成數字100次,會產生更多的「平均」高度,並且正確地具有更少的「短」和「高」高度,更少的「非常短」和「非常高」值。

+2

幾乎看起來更適合數學堆棧交換... –

+0

這裏可能有一些想法:http://stackoverflow.com/questions/5281672/generate-a-random-number-in-a-gaussian-範圍 – PaulF

回答

2

要生成隨機的,但不均勻數據,推測給定的隨機源是均勻的 - 就是說,Random.NextDouble方法,它返回一個0和1

之間(大約)均勻分佈的數

這很簡單。如果Q(age, x)是您的分佈的參數化分位數分位數函數,那麼您可以簡單地將NextDouble中的double值作爲x傳遞給它,並且它會根據您的期望分佈產生一個隨機數。

因爲您已經掌握了百分位數據,您已經知道累積分佈曲線,或者至少您有足夠的分數來接近給定的年齡,所以首先要這樣做。 (相反,如果你有概率分佈曲線,你會整合它來獲得累積分佈曲線。)

顯然累積分佈是單調的,從零到一增加,所以你通過採取逆得到位數功能。

對於漂亮的圖片更詳細的解釋,見

https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

現在,你一個謎:鑑於你的陣列中的數據,你可以去其他的方式?也就是說,考慮到分佈和高度,你能否準確地分配可能的年齡?