【问题标题】:Math function to generate random data生成随机数据的数学函数
【发布时间】:2017-05-21 16:43:00
【问题描述】:

我不太擅长数学,我试图生成一些随机数据,但我不知道如何实现这一点。 我想生成 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)

数值会像曲线一样上下波动,如图:

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

如果我要求太多,请告诉我正确的方向,我会自己弄清楚。

提前致谢。

【问题讨论】:

  • “每根柱子依赖于前一根柱子”有多种方式。但是该段的其余部分没有意义。请澄清。
  • 为了澄清我添加了一张图片。
  • 你能创建一系列斜率一致的值吗?你能连续做几次,做一个之字形吗?你能让斜率和长度随机吗?您可以为每个条添加一个小的随机值以使其看起来不那么完美吗?你不能做的第一部分是什么?

标签: function math equation


【解决方案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),使其不超过&lt;0,100&gt;。这将创建平滑的随机曲线,如条形。

如果我把所有这些放在一起,我可以在 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;
 }

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

【讨论】:

  • 感谢您所做的一切。
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多