生成随机数据的数学函数

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)

数值会像这样的曲线上下波动

断点可能发生在任何地方。

如果我要求太多,请告诉我正确的方向,我会自己想办法。

提前致谢。

我会生成随机曲线,然后用像这样的条对其进行插值:

  1. 生成n个控制点

    x(i)=i;
    y(i)=100.0*Random();
    

    您不需要 x(i) ...

  2. 生成 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;
 }

直接在此处编写的代码未经测试,因此可能包含拼写错误。条形应该平滑地遵循三次曲线,因此它应该满足您的所有需求......如果您需要更多颠簸,您可以使用更大程度的曲线多项式和/或分段插值。有关详细信息,请参阅: