生成随机数据的数学函数
Math function to generate random data
我不太擅长数学,我试图生成一些随机数据,但我不知道如何实现。
我想生成 12 个显示 0 到 100 的条形图。但我不想让它们全部随机,我想让其中一些呈现出如下所示的漂亮曲线结果:
[1: 10], [2: 14], [3: 20], [4: 18],
[5: 22], [6: 33], [7: 62], [8: 51],
[9: 89], [10: 27], [11: 13], [12: 56]
澄清一下:
-编辑 (1)
数值会像这样的曲线上下波动
断点可能发生在任何地方。
如果我要求太多,请告诉我正确的方向,我会自己想办法。
提前致谢。
我会生成随机曲线,然后用像这样的条对其进行插值:
生成n
个控制点
x(i)=i;
y(i)=100.0*Random();
您不需要 x(i)
...
生成 m > n
条柱
所以只需使用 n
点作为 BEZIER 或任何其他多项式曲线的控制点并计算您的条形,同时......假设使用单个 cubic n=4
的简单情况然后您的控制点将转换为多项式:
y(t) = a0 + a1*t +a2*t^2 + a3*t^3
所以像这样计算每个条的大小:
i={0,1,2,3,...,m-1}
t=i/(m-1); // this converts i to t=<0,1>
bar(i) = a0 + a1*t +a2*t^2 + a3*t^3
不要忘记限制 bar(i)
,使其不超过 <0,100>
。这将创建像条一样的平滑随机曲线。
如果我把所有这些放在一起,我可以在 C++ 中做这样的事情:
double d1,d2,y0,y1,y2,y3,a0,a1,a2,a3,t;
// n=4 random control points for cubic
y0=100.0*Random();
y1=100.0*Random();
y2=100.0*Random();
y3=100.0*Random();
// convert them to interpolation cubic
d1=0.5*(y2-y0);
d2=0.5*(y3-y1);
a0=y1;
a1=d1;
a2=(3.0*(y2-y1))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-y2+y1));
// compute m bars
const int m=10;
double bar[m]; int i;
for (i=0;i<m;i++)
{
t=double(i)/double(m-1);
bar[i] = a0 + a1*t +a2*t*t + a3*t*t*t;
if (bar[i]<0.0) bar[i]=0.0;
if (bar[i]>100.0) bar[i]=100.0;
}
直接在此处编写的代码未经测试,因此可能包含拼写错误。条形应该平滑地遵循三次曲线,因此它应该满足您的所有需求......如果您需要更多颠簸,您可以使用更大程度的曲线多项式和/或分段插值。有关详细信息,请参阅:
我不太擅长数学,我试图生成一些随机数据,但我不知道如何实现。 我想生成 12 个显示 0 到 100 的条形图。但我不想让它们全部随机,我想让其中一些呈现出如下所示的漂亮曲线结果:
[1: 10], [2: 14], [3: 20], [4: 18],
[5: 22], [6: 33], [7: 62], [8: 51],
[9: 89], [10: 27], [11: 13], [12: 56]
澄清一下:
-编辑 (1)
数值会像这样的曲线上下波动
断点可能发生在任何地方。
如果我要求太多,请告诉我正确的方向,我会自己想办法。
提前致谢。
我会生成随机曲线,然后用像这样的条对其进行插值:
生成
n
个控制点x(i)=i; y(i)=100.0*Random();
您不需要
x(i)
...生成
m > n
条柱所以只需使用
n
点作为 BEZIER 或任何其他多项式曲线的控制点并计算您的条形,同时......假设使用单个 cubicn=4
的简单情况然后您的控制点将转换为多项式:y(t) = a0 + a1*t +a2*t^2 + a3*t^3
所以像这样计算每个条的大小:
i={0,1,2,3,...,m-1} t=i/(m-1); // this converts i to t=<0,1> bar(i) = a0 + a1*t +a2*t^2 + a3*t^3
不要忘记限制
bar(i)
,使其不超过<0,100>
。这将创建像条一样的平滑随机曲线。
如果我把所有这些放在一起,我可以在 C++ 中做这样的事情:
double d1,d2,y0,y1,y2,y3,a0,a1,a2,a3,t;
// n=4 random control points for cubic
y0=100.0*Random();
y1=100.0*Random();
y2=100.0*Random();
y3=100.0*Random();
// convert them to interpolation cubic
d1=0.5*(y2-y0);
d2=0.5*(y3-y1);
a0=y1;
a1=d1;
a2=(3.0*(y2-y1))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-y2+y1));
// compute m bars
const int m=10;
double bar[m]; int i;
for (i=0;i<m;i++)
{
t=double(i)/double(m-1);
bar[i] = a0 + a1*t +a2*t*t + a3*t*t*t;
if (bar[i]<0.0) bar[i]=0.0;
if (bar[i]>100.0) bar[i]=100.0;
}
直接在此处编写的代码未经测试,因此可能包含拼写错误。条形应该平滑地遵循三次曲线,因此它应该满足您的所有需求......如果您需要更多颠簸,您可以使用更大程度的曲线多项式和/或分段插值。有关详细信息,请参阅: