Zufälliges Mischen von Variablen!?
klaus
- javascript
0 Gernot Back0 Andreas Lindig0 Pete0 JürgenB0 Gernot Back
Nabend!
Habe folgendes Problem:
Ich will einem Variablen-Array zufällig Werte zuweisen, was auch mit folgendem Code einwandfrei funtioniert:
function vermischen()
{
do
{
rdm=Math.floor(Math.random()*12);
zahlen[n] = rdm;
n=n+1;
}
while(n < 12);
}
Leider wird hier nicht berücksichtigt, dass keine Zahl zweimal vorkommen darf!!! Wie kann ich die Schleife umbauen, damit keine Variable des Arrays dengleichen Zahlenwert zugewiesen bekommt?
danke im vorraus...
lg klaus
Hallo
function vermischen()
{
do
{
rdm=Math.floor(Math.random()*12);
zahlen[n] = rdm;
n=n+1;
}
while(n < 12);
}
Leider wird hier nicht berücksichtigt, dass keine Zahl zweimal vorkommen darf!!! Wie kann ich die Schleife umbauen, damit keine Variable des Arrays dengleichen Zahlenwert zugewiesen bekommt?
Bei meinen Memorys habe ich es so gemischt:
function wuerfel () {
zahl=-1;
do {
zahl=parseInt(Math.random()*meinBasisArray.length);
} while((isNaN(zahl))||(zahl<0));
return zahl;
}
var mix = new Array ();
for (i=0; i<meinBasisArray.length ; i++ ) {
mix[i] = wuerfel();
for (j=0 ;j<i ;j++ ) {
if(mix[i]==mix[j]){
i--;
}
}
}
Gruß Gernot
Hallo Gernot,
Bei meinen Memorys
ich würde da eine kleine Meldung für nicht-JS-Surfer machen. Bei mir stand "Spiel wird geladen bitte Geduld!". Wer Pech hat, wartet da erstmal ne Viertelstunde.
Gruß, Andreas
Hallo Andreas,
ich würde da eine kleine Meldung für nicht-JS-Surfer machen. Bei mir stand "Spiel wird geladen bitte Geduld!". Wer Pech hat, wartet da erstmal ne Viertelstunde.
Guter Tipp, als ich das vor drei Jahren programmiert habe, habe ich an die JS-Nicht-Nutzer noch nicht gedacht. Schalt es halt mal ein, du weißt, ich bin vertrauenswürdig ... ;-)
Gruß Gernot
Guter Tipp, als ich das vor drei Jahren programmiert habe, habe ich an die JS-Nicht-Nutzer noch nicht gedacht.
hehe, ging mir in meiner ersten JS-Euphorie genauso ;-) Ist echt schade, daß da soviel Mißbrauch mit getrieben wird, weil das ein wirklich extrem nützliches Werkzeug für die Webseitenfunktionalität sein könnte.
hab' ich schon längst gemacht - ist klasse, das Spiel. Aber trotzdem: ich habe JS nur eingeschaltet, weil ich wußte, worum es geht. Normalerweise wäre ich gar nicht darauf gekommen, daß da ein Problem wg. JS vorliegt.
Gruß, Andreas
Bei meinen Memorys habe ich es so gemischt:
Dein Beispiel läuft übrigens nicht unter OSX, Firefox Es dreht sich keine Karte um.
Pete
Hallo,
beim Mischen hast Du mehrere Möglichkeiten. Wenn Du nur irgendwelche Zufallswerte benötigst, die nicht zweimal vorkommen dürfen, ist die Lösung von Gernot gut. Wenn du aber eine vorgegebene Menge mischen willst, wie z.B. bei einem Kartenspiel oder bei einer zufälligen Auswahl von Bildern, biete sich folgende Lösung an:
du nimmst ein 2D-Array, legst in die eine Spalte deine Werte und füllst die andere Spalte mit Zufallszahlen. Wenn Du nun das 2D-Array nach der Spalte mit den Zufallszahlen sortierst, ist die andere Spalte gemischt. Ein Beispiel findest Du unter:
[link:http://www.j-berkemeier.de/Buchstabenmixer.html
Gruß, Jürgen
Hallo,
beim Mischen hast Du mehrere Möglichkeiten. Wenn Du nur irgendwelche Zufallswerte benötigst, die nicht zweimal vorkommen dürfen, ist die Lösung von Gernot gut. Wenn du aber eine vorgegebene Menge mischen willst, wie z.B. bei einem Kartenspiel oder bei einer zufälligen Auswahl von Bildern, biete sich folgende Lösung an:
du nimmst ein 2D-Array, legst in die eine Spalte deine Werte und füllst die andere Spalte mit Zufallszahlen. Wenn Du nun das 2D-Array nach der Spalte mit den Zufallszahlen sortierst, ist die andere Spalte gemischt. Ein Beispiel findest Du unter:
http://www.j-berkemeier.de/Buchstabenmixer.html
Das ist komplexer als nötig, da gibt es eine geradezu klassische Lösung (So klassisch, das ich noch nicht einmal herausbekommen konnte, wer's als erster gefunden hat ;-), die das Array in-place mischt (Hier in C):
for(i=0;i<ArraySize;i++){
randnum = (myRandom() % ArraySize);
tmp = array[i];
array[i] = array[randnum];
array[randnum] = tmp;
}
Für jedes Mitglied im Array erzeuge eine Zufallszahl im gewünschtem Bereich (meistens die Kardinalität, also alle) und tausche mittels einer temporären Variablen (Kann in Sonderfällen natürlich auch entfallen) die gerade ausgesuchte Stelle im Array gegen eine zufällig ausgewählte Position im Array.
Die Auswahl des Zufallbereiches mittels Modulo ist für einige Zwecke nicht ausreichend zufällig (Ergibt Häufung im unterem Bereich), für so ein wenig Spielerei reicht's aber vollkommen.
(Ich empfehle übrigens eine eigene Zufallsfunktion für solche Spielereien, da die Systementropie dafür nun wirklich zu kostbar ist)
so short
Christoph Zurnieden
Hallo Christoph,
der Algorithmus ist kurz und gut. Danke für den Tipp.
Gruß, Jürgen
Hallo Pete,
Bei meinen Memorys habe ich es so gemischt:
Dein Beispiel läuft übrigens nicht unter OSX, Firefox Es dreht sich keine Karte um.
Unter Windows, Mozilla läuft alles wie von mir gewünscht. Komisch, woran könnte denn das liegen? Wenn jemand eine Idee hat, wie ich das auf einfache Weise beheben kann (kann es ja nicht selbst testen), wäre ich dankbar für einen Tipp. (Andererseits, so wichtig ist mir diese Spielerei nun auch nicht mehr)
Gruß Gernot