我正在测试不同的JavaScript图形框架。我正在尝试使用生成的数据绘制折线图和散点图。虽然一切都很顺利。我在尝试为散点图生成数据时遇到了麻烦。
因此,用PHP或任何其他语言做这样的事情会非常容易:
for ($i=0; $i < $x; $i++) {
$data[] = array(
'x' => mt_rand(0, 10000),
'y' => mt_rand(0, 10000)
);
}
结果在整个图表中几乎相同地分布。所以在这里我试图想出一种方法来提出更好的随机数据,最终看起来更像是散点图,而不是页面上均匀分布的点。我无法想出任何东西。
我想最终得到更像是来自网络的随机散点图:
所以情节的某些部分更加激烈,角落里几乎没有任何东西。但我不想让一个点完全不可能到达角落。
任何算法创意?
答案 0 :(得分:2)
对于您所展示的图像,您要在其周围划分数据的行,这很容易。例如,想象一下y = x * 0.75
的一行。鉴于此,您选择范围x
中的0..xMax
值(无论您的最大X值是多少),然后生成y
的值,但有一些差异。例如,如果90%的时间Y值在预期值的10%范围内,那么您将生成0.675x和0.825x之间的随机值。
假设5%的时间,Y值在预期值的50%范围内,5%的时间值不受约束。对于其中的每一个,您都以相同的方式生成Y值:一个等于预期Y值的随机值,加上或减去50%(或者,在后一种情况下,加上或减去一些非常大的数字)。
您可以根据需要调整概率和方差。
您还可以调整X值的分布。例如,看起来您的大多数数据点介于约.15 xMax和.6 xMax之间。所以你想要的是该范围内更高百分比的X值。想象一下,那么你的X值分为三个不同的范围:
0 to .149 * xMax - 20%
.15 to .60 * xMax - 70%
> .60 xMax - 10%
生成0到100之间的随机数。然后:
if value < 20, generate an x value between 0 and .15 xmax
if value > 19 & < 60, generate an x value between .15 xMax and .60 xMax
otherwise, generate an x value > .60 xMax and < xMax
答案 1 :(得分:1)
定义一个成为分布中心线的函数,例如c(x)= sqrt(x)。
定义一个函数,指定与中心线的最大允许偏差,例如d(x)= 0.1(x - 5)²。
对于每个x值,生成一个或几个y值y(x)= c(x)+ 2 *(random() - 0.5)* d(x)其中random()是a(伪)值为[0; 1]的随机数生成器。
为了更逼真的外观,请使用具有更有趣分布的(伪)随机数生成器,例如,使用标准差d(x)分布的法线。