[GastForen Programmierung/Entwicklung JavaScript Zufallsgenerator

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

14. Nov 2004, 18:40
Beitrag # 1 von 23
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Angenommen ich möchte die Sätze
"Der Baum ist grün", "Der Esel ist grau", und "Der Himmel ist blau"
in zufälliger Reihenfolge auf einer Seite erscheinen lassen, was müsste ich dann machen?

Beziehungsweise: Diese Sätze selbst sind nicht besonders schwierig. Ich kann einfach dreimal eingeben:

<script language="JavaScript" type="text/javascript">
<!--

text = new Array(3);
text[0] = 'Der Baum ist gruen'
text[1] = 'Der Esel ist grau'
text[2] = 'Der Himmel ist blau'

index = Math.floor(Math.random());
document.write(text[index]);
// -->

</script>

(Wobei einfach die Gefahr besteht dass ein Satz wiederholt wird. Nebenbei: Wie verhindert man das?)

Was es jetzt aber noch schwerer macht: der Inhalt, den ich wirklich in zufälliger Reihenfolge anzeigen will, ist nicht nur Text (die obigen Sätze sind natürlich nur Beispiele) sondern auch Code. Und in diesem Code hat es auch Anführungszeichen, deshalb werd ich ihn wohl nicht einfach so in den text[0] = '' -tag setzen können, da es sonst wegen den Anführungszeichen einen Error gibt. Wie mach ich es dann? Wie kann ich also mehrere Stücke Code in Zufälliger Reihenfolge auf einer Seite erscheinen lassen? (So dass man dann natürlich das Resultat des Codes sieht, nicht den Code selbst)

(Dieser Beitrag wurde von Larvarin am 14. Nov 2004, 18:43 geändert)
X

Zufallsgenerator

Markus Walker
Beiträge gesamt: 494

17. Nov 2004, 08:02
Beitrag # 2 von 23
Beitrag ID: #125077
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Lavarin

Dein Script hat noch einen grundsätzlichen Mangel. Da die Methode Math.random() einen Wert zwischen 0 und 1 zurück gibt und Math.floor() auf den nächst niedrigen Integer abrundet wird die Variable index immer den Wert 0 beinhalten.
http://de.selfhtml.org/...ekte/math.htm#random
http://de.selfhtml.org/...jekte/math.htm#floor

Also müsste zuerst diese Zeile wiefolgt geändert werden:
index = Math.floor(Math.random() * text.length);

Wiederholungen könntest Du vermeiden indem eine weitere Variable index_old einführst und solange neue Zahlen generierst, bis sich die neue Zahl von der alten unterscheidet:

index = 0; //Initialisierung
index_old = -1; //Initialisierung zu einem Wert den index nie annehmen wird
/* Diese Initialisierung darf nur einmal durchlaufen werden z.B. als Script im head-Bereich, wenn die Seite geladen wird. der folgende Teil kann dann zum Beispiel in ein Funktion gepackt werden.
*/

do {
index = Math.floor(Math.random() * text.length);
} while(index == index_old);
index_old = index;


Das Problem mit den Anführungszeichen kann gelösst werden indem einfache und doppelte Anführungszeichen verschachtelt werden:
window.setTimeout("window.alert('Hallo')" , 5000);

Weiter könnten Anführungszeichen maskiert werden:
window.setTimeout("window.alert('Er saget: \"Hallo\"')" , 5000);


HTH


als Antwort auf: [#124402]

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

17. Nov 2004, 12:52
Beitrag # 3 von 23
Beitrag ID: #125181
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Naja, ich hab das Script von einer Seite. Ehrlich gesagt weiss ich gar nicht so richtig wofür der "math.random"-Teil ist. Also was macht er genau? (Bin bei Javascript noch ein ziemlicher Neuling ^_^')
Mal sehen, eine Zahl "index" wird definiert..und was passiert dann?


als Antwort auf: [#124402]

Zufallsgenerator

Markus Walker
Beiträge gesamt: 494

18. Nov 2004, 07:50
Beitrag # 4 von 23
Beitrag ID: #125395
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Lavarin

>Ehrlich gesagt weiss ich gar nicht so richtig wofür der "math.random"-Teil ist.
Wenn Du oben gepostetem Link folgst siehst Du dass Math.random() eine pseudo-zufällige Zahl zwischen 0 und 1 zurück gibt.
Also muss das Ergebnis von Math.random() mit der Anzahl Elemente die zur Verfügung stehen multipliziert werden (text.length == Anzahl Elemente im Array).
Da Arrays die Elemente von 0 bis n-1 nummerieren muss aber dieses Anzahl
noch um 1 dekrementiert werden, obwohl ein Rückgabewert von 1 bei Math.random() sehr sehr selten ist (ist oben falsch).
Der zweite Link zeigt, dass Math.floor() auf die nächste ganze Zahl abrundet, also die Nachkoma-Stellen abschneidet.
Da nicht zwei gleiche Werte in Reihe erlaubt werden, wird das Ganze in eine do-while-Schleife gepackt. Das heisst es sollen neue Zahlen generiert werden, solange die neu generierte Zahl gleich der vorher benutzten Zahl ist.
http://de.selfhtml.org/...chleifen.htm#dowhile

Und in JavaScript ist dies dann eben durch folgende Zeilen dargestellt.

do {
index = Math.floor(Math.random() * --text.length); //text.length wird hier nun vor der Verarbeitung dekrementiert
} while(index == index_old);
index_old = index;


HTH


als Antwort auf: [#124402]

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

18. Nov 2004, 20:15
Beitrag # 5 von 23
Beitrag ID: #125681
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Aber bei deiner While-Schlaufe teilst du index_old am Ende immer den Wert index zu, das sorgt doch dann nur dafür, dass die gewählte Zahl nicht die gleiche ist wie vorher. Wiederholt kann sie ja trotzdem werden, wenn z.B. zuerst eine 2 kommt, dann eine 1, und dann wieder eine 2. Diese zweite 2 wird dann doch zugelassen, weil das Program ja nur nachprüft was vorher war, und vorher kam 1, es ist also nicht gleich. Oder seh ich das falsch?


als Antwort auf: [#124402]

Zufallsgenerator

Markus Walker
Beiträge gesamt: 494

18. Nov 2004, 22:01
Beitrag # 6 von 23
Beitrag ID: #125701
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Lavarin

Das siehst Du ganz richtig. Da immer die Rede von einer Anwendung mit Math.random() war, implizierte ich, dass nur einmalige Wiederholungen auszuschliessen sind.

Soll also der gesammte Inhalt des Arrays in zufälliger Reihenfolge dargestellt werden, aber jedes Element blos einmal?


als Antwort auf: [#124402]

Zufallsgenerator

Anonym
Beiträge gesamt: 22827

19. Nov 2004, 18:32
Beitrag # 7 von 23
Beitrag ID: #125961
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja. Wie mach ich das dann?


als Antwort auf: [#124402]

Zufallsgenerator

oesi50
  
Beiträge gesamt: 2315

19. Nov 2004, 19:24
Beitrag # 8 von 23
Beitrag ID: #125971
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
so:

var text = new Array(
'Der Baum ist gruen',
'Der Esel ist grau',
'Der Himmel ist blau',
'Die Blume ist gelb',
'Die Nacht ist schwarz'
);
var anzahl = text.length;
var i = anzahl;
var temp
while (i--) {
var j = Math.floor(Math.random() * anzahl);
temp = text[i]; text[i] = text[j]; text[j]= temp;
}



als Antwort auf: [#124402]

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

19. Nov 2004, 19:51
Beitrag # 9 von 23
Beitrag ID: #125976
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke. Könntest du's vielleicht noch kommentieren, damit ichs besser versteh?
Was genau heisst z.B. text.length, (i--), und was macht die letzte Zeile? temp = text; text = text[j]; text[j]= temp


als Antwort auf: [#124402]

Zufallsgenerator

oesi50
  
Beiträge gesamt: 2315

19. Nov 2004, 19:58
Beitrag # 10 von 23
Beitrag ID: #125979
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
text.length

http://de.selfhtml.org/...kte/array.htm#length

i--

http://de.selfhtml.org/...toren.htm#berechnung


temp = text; text = text[j]; text[j]= temp;

was macht c=a, a=b, b=c ?


als Antwort auf: [#124402]

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

19. Nov 2004, 23:09
Beitrag # 11 von 23
Beitrag ID: #126003
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Aber mit "while (i--)" sagst du doch "so lange 1 zur Zahl i addiert wird", oder?? Das kapier ich nicht ganz Ausser ich hab die definition von i-- missverstanden.

Okay, also du teilst dem Wert temp die Anzahl Elemente zu, (so viel mal muss die Schlaufe noch ausgefuehrt werden bis alle Saetze geschrieben wurden), temp kriegt die neue Zufallszahl zugeteilt, und temp[j] wieder die Anzahl Elemente...ich kapier allerdings nicht genau den Zweck, kannst du mir das genauer erklaeren? :/


als Antwort auf: [#124402]

Zufallsgenerator

Larvarin
Beiträge gesamt: 53

21. Nov 2004, 17:35
Beitrag # 12 von 23
Beitrag ID: #126181
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hey, ich hab mir jetzt nochmal deinen code genauer angesehen und kapier jetzt was du da machst: du tauschst also das letzte Objekt im Array mit demjenigen das ausgewählt wurde, sodass das Ausgewählte dann an letzter Stelle ist. Es gibt ja den Befehl arrayname.pop(); der das letzte Objekt eines Arrays löscht. Ich dachte ich hätte jetzt die Lösung, nämlich:

var Satz = new Array();
Satz[0] = "Der Himmel ist blau";
Satz[1] = "Das Gras ist gruen";
Satz[2] = "Die Nacht ist schwarz";
Satz[3] = "Die Sonne ist gelb";
Satz[4] = "Die Rose ist rot";

var anzahl = Satz.length;
var temp
while (Satz.length > 0) {
var j = Math.floor(Math.random() * anzahl);
temp = text[anzahl]; text[anzahl] = text[j]; text[j]= temp;
document.write(Satz[anzahl]);
Satz.pop();
}

Allerdings funktioniert das irgendwie nicht. Es steht dann nichts auf der Seite. Weiss jemand wo der Fehler liegt?
Also, was der code machen soll: Im Array "Satz" hat der Computer die zur Verfügung stehenden Sätze. Er generiert eine Zufallszahl, (in diesem Fall zwischen 0 und 4 weil das die Anzahl des Arrays ist). Dann tauscht er den Satz, dessen Zahl er gewürfelt hat, mit dem letzten Satz des Arrays, sodass der generierte Satz an letzter Stelle steht. Dann schreibt er den letzen Satz auf (also denjenigen den er gewürfelt hat) und löscht darauf diesen Satz aus dem Array. Dies macht er solange bis es keine Sätze mehr im Array hat. Also, wie gesagt, weiss jemand was ich oben falsch gemacht habe?


als Antwort auf: [#124402]

Zufallsgenerator

oesi50
  
Beiträge gesamt: 2315

21. Nov 2004, 17:50
Beitrag # 13 von 23
Beitrag ID: #126183
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
versuch mal das:

var text = new Array(
'Der Baum ist gruen',
'Der Esel ist grau',
'Der Himmel ist blau',
'Die Blume ist gelb',
'Die Nacht ist schwarz'
);
var anzahl = text.length;
var i = anzahl;
var temp
while (i--) {
var j = Math.floor(Math.random() * anzahl);
temp = text[i]; text[i] = text[j]; text[j]= temp;
}
for(var i=0;i < anzahl; i++){
document.write(text[i] + '<br>');
}

und drücke mehrmals auf <reload>




als Antwort auf: [#124402]

Zufallsgenerator

oesi50
  
Beiträge gesamt: 2315

21. Nov 2004, 21:08
Beitrag # 14 von 23
Beitrag ID: #126213
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier ist noch das Beispiel dazu:

http://vsrv.de/...ples/mischen_js.html



als Antwort auf: [#124402]

Zufallsgenerator

Anonym
Beiträge gesamt: 22827

22. Nov 2004, 19:00
Beitrag # 15 von 23
Beitrag ID: #126445
Bewertung:
(14739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Na gut, werd ich machen. Allerdings möchte ich das Script gerne ganz verstehen, darum einige Fragen:

Meinst du es macht einen Unterschied ob ich die einzelnen Objekte des Arrays mit "text[2] = 'Der Himmel ist blau';" oder auf deine Art, mit "new Array(" und einfachen Anführungszeichen angebe?

Weshalb machst du noch eine Extravariabel namens i? Warum benutzt du nicht einfach "anzahl"?

Anscheinend kapier ich die Funktion von "(i--)" noch nicht so richtig. Von dem was ich aus dem Link entnommen habe, bedeutet dies soviel wie "während i immer um eins verkürzt wird". Ich nehme mal an, dass es heisst "bei jedem Durchgang wird i um eins verkürzt, und wenn es null erreicht hör auf". ?

Ach so, jetzt seh ich wie dein Script geht: Das Programm mischt zuerst das Array durcheinander, und schreibt hinterher einfach das ganze Array auf. ^_^ Also ich geh's mal ausprobieren und werd mich melden wenn's geklappt hat.


als Antwort auf: [#124402]
X