2017-05-21 2 views
0

Ich bin nicht wirklich gut in Mathematik, und ich habe versucht, einige zufällige Daten zu generieren, aber ich konnte nicht herausfinden, wie ich das erreichen kann. Ich möchte 12 bar erzeugen, die 0 bis 100 zeigen Aber ich will nicht zu haben, sie alle zufällig, würde Ich mag, wie unten einige von ihnen in einer schönen Kurve Ergebnis haben:Mathematische Funktion zum Generieren von Zufallsdaten

[1: 10], [2: 14], [3: 20], [4: 18], 
[5: 22], [6: 33], [7: 62], [8: 51], 
[9: 89], [10: 27], [11: 13], [12: 56] 

Um zu klären :

-EDIT (1)

Werte wie eine Kurve wie das Bild nach oben und unten werden:

der Knackpunkt kann überall passieren .

Wenn ich zu viel frage, bitte zeigen Sie mir die richtige Richtung, ich werde es selbst herausfinden.

Vielen Dank im Voraus.

+0

Es gibt mehrere Möglichkeiten für „jede Stange zu sein, hängt von den vorherigen.“ Aber der Rest dieses Absatzes ergibt keinen Sinn. Bitte klären Sie. –

+0

Zur Klarstellung habe ich ein Bild hinzugefügt. – PRAISER

+0

Können Sie eine Reihe von Werten mit einheitlicher Steigung erstellen? Kannst du das ein paar Mal hintereinander machen, um einen Zickzack zu machen? Kannst du die Steigungen und Längen zufällig machen? Können Sie jedem Balken einen kleinen zufälligen Wert hinzufügen, damit er weniger perfekt aussieht? Was ist der erste Teil, den du nicht tun kannst? – Beta

Antwort

1

würde ich zufällig Kurve erzeugen und dann interpoliert werden es nur mit den Bars wie:

  1. erzeugen n Kontrollpunkte

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

    Sie brauchen nicht die x(i) ...

  2. erzeugen m > n Bars

    so benutzen Sie einfach die n Punkte als Kontrollpunkte für BEZIER oder jede andere Polynomkennlinie und Ihre Balken berechnen, während ... einfachen Fall Nehmen wir an, mit einzelnen cubicn=4 dann Ihre Kontrollpunkte werden in Polynom konvertieren:

    y(t) = a0 + a1*t +a2*t^2 + a3*t^3 
    

    berechnen, so dass jeder Barren Größe wie:

    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 
    

    vergessen sie nicht, bar(i) zu klemmen so nicht überschreitet 01.231.. Dies erzeugt glatte, zufällige, kurvenartige Balken.

Wenn ich das alles zusammen kann ich so etwas wie dies in C++ tun:

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; 
} 

-Code ungetestet geschrieben direkt hier ist, so dass es Tippfehler enthalten. Die Balken sollten der kubischen Kurve folgen, so dass sie alle Ihre Bedürfnisse erfüllen sollte. Sie können einen größeren Grad an Kurvenpolynom und stückweise Interpolation verwenden, falls Sie mehr Unebenheiten benötigen. Für weitere Informationen siehe:

+0

Danke für alles. – PRAISER

Verwandte Themen