Математическая функция для генерации случайных данных

Я не очень хорош в математике, и я пытался генерировать случайные данные, но я не мог понять, как я могу этого достичь. Я хочу сгенерировать 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]

Чтобы уточнить:

-EDIT (1)

Значения будут идти вверх и вниз, как кривая, такая как на картинке:

Точка разрыва может случиться где угодно.

Если я спрашиваю слишком много, пожалуйста, просто покажи мне правильное направление, я пойму это сам.

Заранее спасибо.

1 ответ

Решение

Я бы сгенерировал случайную кривую, а затем просто интерполировал ее с помощью столбцов:

  1. генерировать n контрольные точки

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

    вам не нужно x(i)...

  2. генерировать m > n брусья

    так что просто используйте n указывает в качестве контрольных точек для BEZIER или любой другой полиномиальной кривой и вычисляет ваши бары, пока... Давайте предположим простой случай, используя одну кубическую 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;
 }

Код не тестируется написано прямо здесь, поэтому он может содержать опечатки. Столбцы должны плавно следовать за кубической кривой, чтобы она удовлетворяла всем вашим потребностям... Вы можете использовать большую степень полинома кривой или кусочную интерполяцию, если вам нужно больше неровностей. Для получения дополнительной информации см.:

Другие вопросы по тегам