Zufallstext
sAks
- javascript
0 Gunnar Bittersmann
0 sAks0 Sven Rautenberg0 Der Martin
0 sAks0 Sven Rautenberg
0 Encoder
Hallo allerseits,
ich bräuchte ein wenig Hilfe bei meinem javascript - vermutlich ist es etwas unvorteilhaft, jedoch funktioniert es wie gewollt (da es zufällig genau 60 Tipps sind).
Ich benutze im nachfolgenden Code 'zuf = Stamp.getSeconds();
' als "Zufallsziehung" eines Tipps. Praktisch gesehen ist es ein Zufallszug, theoretisch nicht. Wie könnte ich, anstelle über die Sekunden des Tages, eine richtige Zufallsziehung (pro Klick) generieren?
Ich hatte es schon über Math.random() probiert, aber ich komme damit überhaupt nicht klar.
<SCRIPT LANGUAGE="JavaScript">
<!-- Anfang
var msg = new Array();
Stamp = new Date();
zuf = Stamp.getSeconds();
msg[1] = "Tip 1";
[...]
msg[60] = "Tip 60";
function tip_zuf() {
document.write(msg[zuf]);
}
// Ende -->
</script>
Noch eine blöde Frage zum Schluss:
Verursacht es eigentlich (wenn man überhaupt in dem Masse reden kann) höhren Prozessoraufwand des Servers bzw. verlangsamt es die Website, wenn man mit zB. 'zuf = Stamp.getSeconds();
' arbeitet? Denn der obige Code arbeitet ja auch, wenn kein Client auf die Website zugreift (im Gegensatz zu Math.random() etc.).
Danke im Voraus.
sAks
@@sAks:
nuqneH
Ich hatte es schon über Math.random() probiert, aber ich komme damit überhaupt nicht klar.
Warum nicht? Der Artikel Gleichverteilte Zufallszahlen erzeugen sollte dir helfen.
<SCRIPT LANGUAGE="JavaScript">
Das 'type'-Attribut http://de.selfhtml.org/javascript/intro.htm#javascriptbereiche@title=fehlt; 'language' ist völlig überflüssig. In die Mülltonne damit.
<!-- Anfang
--8<--
// Ende -->
Die HTML-Auskommentierung von JavaScript-Bereichen ist völlig überflüssig bis schädlich. In die Mülltonne damit.
Qapla'
Vielen Dank Ihnen beiden. Vorallem der Link hat mich, zusammen mit einer weiteren Recherche, auf zwei Ideen gebracht:
var msg = new Array();
msg[1] = "Tip 1";
[...]
a = Math.random();
function getRandom( max )
{
iRandom = Math.round((Math.random() * max + 0.5));
return iRandom;
}
rnd = getRandom(60);
function tip() {
document.write(msg[rnd]);
}
_und_______________________________
var msg = new Array();
msg[1] = "Tip 1";
[...]
function GetRandom( min, max ) {
if( min > max ) {
return( -1 );
}
if( min == max ) {
return( min );
}
return( min + parseInt( Math.random() * ( max-min+1 ) ) );
}
function tip() {
document.write(msg[GetRandom(1,60)]);
}
Kann man sagen, dass eine Version davon sicherer/eleganter ist?
P.S. Bei dem ersten Rechensystem ist ja die Zahl _0_ durch dieses " + 0.5" und math.round mathematisch gesehen nicht inbegriffen?!
Moin!
Kann man sagen, dass eine Version davon sicherer/eleganter ist?
Du hast den Artikel zu gleichverteilten Zufallszahlen nicht gelesen.
P.S. Bei dem ersten Rechensystem ist ja die Zahl _0_ durch dieses " + 0.5" und math.round mathematisch gesehen nicht inbegriffen?!
Du hast den Artikel zu gleichverteilten Zufallszahlen nicht gelesen. Jedenfalls nicht bis zum Ende.
- Sven Rautenberg
Hallo,
a = Math.random();
wozu legst du hier eine Zufallszahl an, die du im nachfolgenden Code nie mehr verwendest?
iRandom = Math.round((Math.random() * max + 0.5));
Auch wenn Sven hier wohl andeuten will, du würdest keine gleichverteilten Zufallszahlen bekommen: Doch, mit diesem Ansatz schon. Es ist nur sehr untypisch, und oft sieht man den fehlerhaften Ansatz:
rnd = Math.round(Math.random()*max);
Hier wäre der Wertebereich [0..max], die Eckwerte eingeschlossen; allerdings würden die Werte 0 und max statistisch gesehen nur halb so oft vorkommen wie die Zwischenwerte. Durch deine Addition von 0.5 verschiebst du den Wertebereich auf [1..max] mit gleicher Wahrscheinlichkeit für alle Werte.
Der einfachere, häufiger empfohlene Weg ist aber
rnd = Math.floor(Math.random()*max);
und der ergibt einen Wertebereich von [0..max-1].
Kann man sagen, dass eine Version davon sicherer/eleganter ist?
Nein, eigentlich nicht. Nur ungewöhnlich sind sie beide - unter anderem dadurch, dass du die Indizierung des Arrays mit 1 beginnst anstatt mit 0, und dadurch das Handling etwas umständlicher wird.
P.S. Bei dem ersten Rechensystem ist ja die Zahl _0_ durch dieses " + 0.5" und math.round mathematisch gesehen nicht inbegriffen?!
Warum diese Verblüffung? Ich dachte, das sei Absicht!
So long,
Martin
Kann man sagen, dass eine Version davon sicherer/eleganter ist?
Nein, eigentlich nicht. Nur ungewöhnlich sind sie beide - unter anderem dadurch, dass du die Indizierung des Arrays mit 1 beginnst anstatt mit 0, und dadurch das Handling etwas umständlicher wird.
Das hat etwas mit den Bildern zu tun. Die 0 ist für eine andere Datei vergeben :-)
P.S. Bei dem ersten Rechensystem ist ja die Zahl _0_ durch dieses " + 0.5" und math.round mathematisch gesehen nicht inbegriffen?!
Warum diese Verblüffung? Ich dachte, das sei Absicht!
Danke. Ja, es war Absicht. Ich habe diese Erkenntnis aus diesem "Gleichverteilte Zufallszahlen erzeugen"-Text. Allerdings hatte ich ihm wohl nicht so ganz vertraut und somit nocheinmal hier nachgefragt ;-)
Danke euch allen. Habe meine Lösung mit eurer Hilfe gefunden.
Moin!
rnd = Math.round(Math.random()*max);
Hier wäre der Wertebereich [0..max], die Eckwerte eingeschlossen; allerdings würden die Werte 0 und max statistisch gesehen nur halb so oft vorkommen wie die Zwischenwerte. Durch deine Addition von 0.5 verschiebst du den Wertebereich auf [1..max] mit gleicher Wahrscheinlichkeit für alle Werte.
Das gilt, wenn Math.round() das Intervall von [i-0.5;i+0.5[ auf die Zahl i abbildet.
Zum Glück stimmt das für positive i auch immer (jedenfalls laut ECMA-262-Standard) - beim Runden erlebt man je nach Programmiersprache ja manchmal so seine Überraschungen, ich erinnere mich da nur an PHP-Rundungen.
Deshalb würde ich im Zweifel die Variante mit Math.floor() bevorzugen.
- Sven Rautenberg
Ich hatte es schon über Math.random() probiert, aber ich komme damit überhaupt nicht klar.
Wo hängts denn?
Denn der obige Code arbeitet ja auch, wenn kein Client auf die Website zugreift (im Gegensatz zu Math.random() etc.).
Wo soll der Code arbeiten? Der läuft auf dem Clientrechner und wenns keinen Client gibt, läuft auch kein Code.
Und wo siehst du den Unterschied zwischen den Funktionen? Die sind doch beide JavaScript, von daher laufen beide nach dem gleichen Prinzip.