PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Javascript: Mehrfache Elemente in Array zählen


Gast
2012-06-02, 10:56:31
Hallo,

ich hab ein Javascript Problem.
Und zwar möchte ich aus gleich verteilten Zahlen normal verteilte Zahlen machen.
Das habe ich mit der Polar-Methode auch soweit hinbekommen.
Aber jetzt habe ich ja nur irgendwelche Zahlen durcheinander. Wenn ich also eine erkennbare Gaus-Verteilung haben möchte, hab ich mir gedacht, erzeuge ich in vielen Durchläufen (abgerundete) Zahlen und zähle dann welche wie oft vorkommt.
Ist die Idee soweit ok?
Wenn ja, wie zählt man denn mehrfache Einträge? O.o
Das Problem wäre ja dann auch, dass ich die Ursprüngliche Ordnung der erzeugten Zahlen beibehalten müsste damit man da was erkennt.

Irgendwie hab ich da gar keine Vorstellung wie das gehen soll. =/

Pinoccio
2012-06-02, 12:05:54
Das ist kein Javascript-Problem. ;-)
Was genau ist denn dein Ziel? Normalverteilte Zufallszahlen zu haben wird es ja nicht sein, denn die hast du ja bereits.

mfg

Gast
2012-06-02, 12:37:42
Das ist kein Javascript-Problem. ;-)
Was genau ist denn dein Ziel? Normalverteilte Zufallszahlen zu haben wird es ja nicht sein, denn die hast du ja bereits.

mfg

Mein Ziel ist die Häufigkeit der Zahlen die ich erzeugt habe auszugeben.
Also ich generiere 100 000 mal 20 normal verteilte Zufallszahlen mit einem gewissen Mittelwert und einer Standardabweichung und will dann gucken wie oft die Zahlen vorkamen.
Das sollte mir doch dann eine große Anzahl nahe des Mittelwerts geben und nach außen hin sollte die Anzahl sinken.
So gauß-glocken mäßig :/

Gast
2012-06-02, 16:55:26
Hab auch noch eine Frage und zwar wollte ich einen variablen Mittelwert und variable Standardabweichung einbauen.
Aber irgendwie kommt nur Murks raus wenn ich die Werte per prompt abfrage.
zahlen direkt im Code machen kein Problem.

Ich poste mal was ich gemacht hab.

var miwe1 = prompt("Mittelwert:");
miwe = parseFloat(miwe1);
var stdabw = prompt("Standardabweichung:");
var ausg = "Normal-verteilte Zufallszahlen:\n";
var z = 0;
var g = 0;
for(var i=0;i<10;i++) {
z = zufall_normal(miwe,stdabw);
ausg += z+", ";
}
document.write(ausg);
//document.write (q);

function zufall_normal(stdabw,miwe) {

var q = 2;
while (q == 0 || q>1) {
u1 = 2 * Math.random() - 1;
u2 = 2 * Math.random() - 1;
q = u1 * u1 + u2 * u2;
}
q= Math.sqrt((-2 * Math.log(q)) / q);

var z = (stdabw * u1 * q) + miwe;
return z;

}

Gast
2012-06-02, 18:25:19
Wieder ein Update. Es lag wohl an einem Dreher in der Funktion und der falschen Interpretation der prompt Eingabe.


hier wie es jetzt ist:

var miwe1 = prompt("Mittelwert:","");
miwe = parseFloat(miwe1);
var stdabw = prompt("Standardabweichung:","");
var ausg = "Normal-verteilte Zufallszahlen:\n";
var z = 0;
var g = 0;
for(var i=0;i<10;i++) {
z = zufall_normal(miwe,stdabw);
ausg += z+", ";
}
document.write(ausg);
//document.write (q);

function zufall_normal(miwe,stdabw) {

var q = 2;
while (q == 0 || q>1) {
u1 = 2 * Math.random() - 1;
u2 = 2 * Math.random() - 1;
q = u1 * u1 + u2 * u2;
}
q= Math.sqrt((-2 * Math.log(q)) / q);

var z = (stdabw * u1 * q) + miwe;
return z;

}


Aber wie könnte ich jetzt diese (ganzen in dem Fall dann) zahlen beliebig oft generieren und dann derren Häufigkeit zählen?

Pinoccio
2012-06-03, 14:25:09
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Gaussian random numbers</title>
<!-- using dygraph for plot -->
<script type="text/javascript" src="http://dygraphs.com/dygraph-combined.js"></script>
</head>
<body>
<div id="graphdiv">Place for graph</div>
</body>
<script type="text/javascript">
var anzahl=prompt("Anzahl:","");
anzahl = parseInt(anzahl);


var miwe1 = prompt("Mittelwert:","");
miwe = parseFloat(miwe1);
var stdabw = prompt("Standardabweichung:","");
stdabw = parseFloat(stdabw);
var ausg = "Normal-verteilte Zufallszahlen:<br \>";
var z = 0;
var zar=new Array();
var g = 0;
for(var i=0;i<anzahl;i++) {
z = zufall_normal(miwe,stdabw);
zar[i]=z;
if (i<10) {
ausg += z+"<br \>";
}
}
document.write(ausg);
var histdata="Wert,Haeufigkeit\n";
hist(zar);
g = new Dygraph(document.getElementById("graphdiv"),histdata);

function hist(zar) {
// Histogramm über +/-3 sigma, deckt 99,73% ab
var steps=20;
var bins=new Array(steps);
for (j=0;j<20;j++){bins[j]=0;}
var _b=0;
for (var k=0;k<anzahl;k++) {
// zurücknormalisieren
_b=(zar[k]-miwe)/stdabw;
_b=(_b+3)/6*steps;
_b=Math.round(_b);

if (_b<0 || _b>steps) {}else{
bins[_b]++;
}
}
document.write("<br \>Histogram<br \>");
var h="";
for (var k=0;k<steps;k++) {
var bmi=miwe-(3*stdabw)+(6*stdabw/steps)*k;
bmi=Math.round(bmi*1000)/1000;
var bma=miwe-(3*stdabw)+(6*stdabw/steps)*(k+1);
bma=Math.round(bma*1000)/1000;
h=h+"BIN "+k+" von "+bmi+" bis "+ bma+" enthaelt "+bins[k]+" Elemente <br />";
histdata=histdata+bmi+","+bins[k]+"\n";
}
document.write(h);
}

function zufall_normal(miwe,stdabw) {

var q = 2;
while (q == 0 || q>1) {
u1 = 2 * Math.random() - 1;
u2 = 2 * Math.random() - 1;
q = u1 * u1 + u2 * u2;
}
q= Math.sqrt((-2 * Math.log(q)) / q);
var z = (stdabw * u1 * q) + miwe;
return z;

}
</script>
</html>
In Datei kopieren und als html abspeichern. (Oder auch dort (http://htmledit.squarefree.com/) reinkopieren und online ansehen.)


hth, mfg

pest
2012-06-04, 07:57:12
Irgendwie hab ich da gar keine Vorstellung wie das gehen soll. =/

Habe mir den Rest nicht durchgelesen, also sorry falls Pinoccio das schon geschrieben hat.

Die Lösung ist einfach

Bilde Klassen von Zahlen und zähle wie oft jede Klasse vorgekommen ist
also z.B. [-10,0),[0,10) usw.

Ist n_i die Anzahl der Vorkommen in einer Klasse errechnet sich die Häufigkeitsdichte dann durch h_i=n_i/d_i wobei d_i die Klassenbreite darstellt.

Das ist dann ein Häufigkeitshistogramm.

Das sieht dann so aus

http://www.abload.de/img/lognslkm9.png