shuffle

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

Jofre

Erfahrenes Mitglied
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:
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.
 
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.
 
Ü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.
 
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.
 
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.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück