shuffle


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Jofre

Erfahrenes Mitglied
#1
Javascript:
function erstellKombination()
{
var buch1 =[ "a","b","c","d","e","f","g","h","i","j"];
var buch2 =[ "H","I","j","k","l","m","n","o","p","q"];
var zahl = [0,1,2,3,4,5,6,7,8,9];
    var zw1=shuffleArray(buch1);
    var zw2=shuffleArray(zahl);;
    var zw3=shuffleArray(buch2);   
    for (let i =0 ; i < 9;i++){
        gesuchtBasis[i]= zw1[i] + zw2[i] + zw3[i];
    }
    gesuchtNeu= shuffleArray(gesuchtBasis);
   
    console.log("gesuchtBasis  in erstellkombination " +gesuchtBasis);
    console.log("gesucht neu " +gesuchtNeu);
}
warum ist gesuchtBasis identisch mit gesuchtNeu?
Shuffle aus dem Netz
Javascript:
function shuffleArray(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

n/a
Moderator
#3
gesuchtBasis ist ein String, kein Array. Da kannst du lange shuffle drauf machen, der String bleibt gleich.

Zudem wozu eine Schleife 9 mal durchgehen, wenn darin alle 2 zw-Werte immer die gleichen sind? Selbst wenn du dort aus dem gesuchtBasis einen Array machen würdest, währen alle Einträge dieselben.
 

Sempervivum

Erfahrenes Mitglied
#4
Das ist genau das Problem mit dem Posten ohne Codetags. Dieses:
gesuchtBasis= zw1 + zw2 + zw3;
ist mit Sicherheit in Wirklichkeit dieses:
gesuchtBasis[i]= zw1[i] + zw2[i] + zw3[i];
([i] wird als BB-Code für "italic" bzw. "kursiv" interpretiert)
Dann wird ein Schuh aus diesem Code.
Inzwischen ist mir jedoch eingefallen, warum beide Array gleich sind:
Übergibt man ein Array als Parameter an eine Funktion, so wird es nicht geklont, sondern lediglich eine Referenz übergeben. D. h. das Shuffle wirkt ebenso auf das Quellarray und am Schluss sind beide gleich.
 

ComFreek

Mod | @comfreek
Moderator
#6
Übergibt man ein Array als Parameter an eine Funktion, so wird es nicht geklont, sondern lediglich eine Referenz übergeben. D. h. das Shuffle wirkt ebenso auf das Quellarray und am Schluss sind beide gleich.
Genau, die hier verwendete Shuffle-Funktion (die übrigens den Fisher-Yates Algorithmus implementiert) arbeitet in-place.

Du solltest übrigens kein var mehr nutzen!

Hier einen guten Beitrag zum clonen eines Arrays:
JavaScript Clone Array
Das Verändern eines built-in Prototypes war noch nie eine gute Idee. Aber slice zu verwenden ist in der Tat eine valide Möglichkeit, siehe auch Fastest way to duplicate an array in JavaScript - slice vs. 'for' loop. Persönlich mag ich Array.from(oldArray) und [...oldArrray] am liebsten.
 

ComFreek

Mod | @comfreek
Moderator
#8
Hast du da weitere Infos dazu? Bin auch gerade nach 8 Jahren wieder mal ein wenig in Javascript unterwegs und in allen Anleitungen die ich finde wird var verwendet.
var ist function-scoped, d.h. die Variable ist in der ganzen äußeren Funktion sichtbar. Imo sollte man immer den kleinsten Scope für Variablen verwenden - das ist der Block Scope und genau das, was "let" und "const" machen. Und wenn man keine Neuzuweisung benötigt, dann am besten "const" statt "let".

Eine feste Referenz habe ich nicht in der Hinterhand, aber JavaScript ES6+: var, let, or const? – JavaScript Scene – Medium habe ich auf die Schnelle via Google gefunden.

Das ist so ein bisschen wie mysql_real_escape_string ;) Es dauert wohl noch ein paar Jahre, bis das annähernd aus Top Google Hits verschwunden ist.
 

ComFreek

Mod | @comfreek
Moderator
#10
Wenn wir schon offtopic bei Codeverbesserungen sind ;)
Javascript:
var temp = array[I];
array[i] = array[j];
array[j] = temp;
Das kann einfacher wie folgt geschrieben werden:
Javascript:
[array[i], array[j]] = [array[j], array[i]]
(Das nennt sich Destructuring assignment)

Möglicherweise funktionieren diese Features übrigens nicht in IE 10 oder anderen älteren Browsern. Bei größeren Projekten setzt man meist dann eh ein Buildsystem ein, was das moderne JS in älteres JS runterkompiliert.
 

Sempervivum

Erfahrenes Mitglied
#12
Durchgemischt bekommst Du es schon bei dem Code, den Du hast, nur dass die originale Version verloren geht. Wenn Du diese behalten möchtest, musst Du das Array klonen, so wie es in dem Link in #6 beschrieben wird.
 

Jofre

Erfahrenes Mitglied
#13
Lösungsidee?

Ich nehme in diesem Beispiel zahl erneut . Shuffle zahl erneut und weise über eine for Schleife
gesuchtNeu =gesuchtBasis[zw2];

habe mit .... versucht zu arbeiten.

ist das ok?
 

Sempervivum

Erfahrenes Mitglied
#15
Dieses funktioniert bei mir:
Code:
        function erstellKombination() {
            var buch1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
            var buch2 = ["H", "I", "j", "k", "l", "m", "n", "o", "p", "q"];
            var zahl = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
            function shuffleArray(array) {
                for (var i = array.length - 1; i > 0; i--) {
                    var j = Math.floor(Math.random() * (i + 1));
                    var temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
            function cloneArray(arr) {
                let newArray = [];
                for (let i = 0; i < arr.length; i++) {
                    newArray[i] = arr[i];
                }
                return newArray;
            }

            var zw1 = cloneArray(buch1);
            shuffleArray(zw1);
            var zw2 = cloneArray(buch2);
            shuffleArray(zw2);
            var zw3 = cloneArray(zahl);
            shuffleArray(zw3);
            console.log("buch1 durchgemischt:" + zw1);
            console.log("buch2 durchgemischt:" + zw2);
            console.log("zahl durchgemischt:" + zw3);

            var gesuchtBasis = [];
            for (let i = 0; i < 10; i++) {
                gesuchtBasis[i] = zw1[i] + zw2[i] + zw3[i];
            }
            gesuchtNeu = cloneArray(gesuchtBasis);
            shuffleArray(gesuchtNeu);

            console.log("gesuchtBasis  in erstellkombination " + gesuchtBasis);
            console.log("gesucht neu " + gesuchtNeu);
        }
        erstellKombination();
Man hätte es noch etwas eleganter machen können, indem man die shuffle-Funktion als Prototyp für Array definieren würde. Oder man hätte das Klonen in die shuffle-Funktion übernehmen können.
 

ComFreek

Mod | @comfreek
Moderator
#18
Man hätte es noch etwas eleganter machen können, indem man die shuffle-Funktion als Prototyp für Array definieren würde.
Das Verändern eines built-in Prototypes war noch nie eine gute Idee.
Siehe auch Why is extending native objects a bad practice?.

(Wenn meine ständigen offtopic Verbesserungsvorschläge zu viel werden, sagt es ruhig ;) Ich mache es nur in der Hoffnung auf besseren Code auf dieser Erde :coffee:)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…