我有一个带有角色年龄的浮点数,以及一个平均身高数据的数组。
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 },
...
我想根据年龄随机生成角色的身高。我使用CDC中的这些图表按年龄平均身高:here
图表将高度降低到百分位数。
因此,对于年龄:180.5个月(15.5岁)的角色,他们的身高平均值(以厘米为单位)显示为:
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次,我&# 39; ll生成更多"平均"高度,并正确地减少"短"和"高"高度,甚至更少"非常短"并且"非常高"值。
答案 0 :(得分:2)
您希望生成随机但非统一数据,可能会给出一个统一的随机源 - 例如,返回(大致)均匀分布的数字的Random.NextDouble
方法介于0和1之间。
这很容易。如果Q(age, x)
是您的发行版的年龄分位数参数化函数,那么您可以简单地将NextDouble
的双精度值作为x传递给它,这将从您所需的分布中产生一个随机数。
因为你有百分位数据,你已经知道了累积分布曲线,或者至少你有足够的分数来估算给定的年龄,所以从这开始。 (如果您有概率分布曲线,则积分以获得累积分布曲线。)
显然,累积分布是单调的,从零增加到1,所以你通过反演获得分位数函数。
有关漂亮照片的更长解释,请参阅
https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
现在,给你一个谜题:给定数组中的数据,你能走另一条路吗?也就是说,考虑到分布和高度,你能准确分析可能的年龄吗?