我想为我的可视化项目(在JavaScript中)创建一些“模拟数据”。
我希望根据某些< z步间隔,将 x个单位的总数分配给 y个不同的群体 strong>概率分布函数,即正态或对数正态。
示例:
使用常规密度函数将正好100个单位分配给0-5000,5000-10000,[...],75000-80000组。
应该渲染这样的东西:
binNames = [ "0-5000", "5000-10000", [...] ]
binData = [ 0,0,0,1,2,10,12,14,12,10 [...] ] //SUM = 100
(如果我可以用简单的种子参数引入一些偏斜,那将是一个奖励。)
答案 0 :(得分:9)
D3.js library有一个有用的工具,d3.random.normal
(reference,code)。即使您没有使用D3,也可以将该功能复制到您自己的代码中。它返回一个生成函数,它将根据您提供的平均值和标准差生成一个具有正态分布的随机数。
使用该功能,您可以以您想要的格式制作一些随机数据,如下所示:
// data generator
var bins = 16,
target = 100,
step = 5000,
max = bins * step,
stddev = max * .15,
data = [],
generator = d3.random.normal(max/2, stddev),
x=0, y=0;
// set up bins
while (x++ < bins) data.push(0);
// add numbers
while (y++ < target) {
// get a new number
var number = generator();
// don't allow numbers outside the desired range
number = ~~Math.max(0, Math.min(number, max));
// increment the bin
bin = ~~(number / max * bins);
data[bin]++;
}
我制作了一个动画直方图作为示例:http://bl.ocks.org/2034281
答案 1 :(得分:0)
您正在寻找的算法是kd树或树形图。 kd树降低了尺寸复杂度。有一个免费的jquery树图可供下载。