Array auf "Duplikate" überprüfen

Oskar.p

Mitglied
Hallo,
ich habe ein Problem mit einem Script. Ich will mit Hilfe eines Script 6 zufällig generierte Zahlen ausgeben (Ich will sozusagen Lottozahlen ausgeben). Da aber auch in Lotto eine Zahl nicht doppelt vorkommt, will ich den Array auf Duplikate überprüfen und diese dann löschen, oder eine neue Zahl generieren. Nun, da ich ein absoluter Anfänger in dem Bereich bin, suche ich mir jetzt hier Hilfe. In HTML habe ich bereits eine Tabelle erstellt, die die Ergebnisse tabellarisch ausgibt, deshalb auch die 6 getElementByIds (vllt lässt sich dieses noch verkürzen)
Aber das Script funktioniert nicht...
Zur info:
-die Funktion generateRandom habe ich schon eingebunden.
-rdmOpt bedeutet random Output
-kann auch sein das hier offensichtliche Fehler vorliegen (Anfänger halt ;) )


Javascript:
function generateOutput()
{
    var output = new ArrayList(6);
   
    for (var a = 0 ; a < output.length ;a++)  //könnte man hier auch output.size nehmen?
    {
        var rand = generateRandom(49);
        if(output.contains(rand))
            {
                a = a -1;
            }
            else
            {
                output.add(rand);
            }

    }

    document.getElementById("rdmOpt1").innerHTML = output[1]; //vllt kann man dieses hier kürzen
    document.getElementById("rdmOpt2").innerHTML = output[2];
    document.getElementById("rdmOpt3").innerHTML = output[3];
    document.getElementById("rdmOpt4").innerHTML = output[4];
    document.getElementById("rdmOpt5").innerHTML = output[5];
    document.getElementById("rdmOpt6").innerHTML = output[6];
}

    document.getElementByID("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );
 
Zuletzt bearbeitet:

Barista

Top Contributor
Arrays in Javascript sind eigentlich assoziative Arrays, also wie Maps in Java.

Du kannst also einfach ein Array mit der zu prüfenden Zahl als Index und mit Boolean True befüllen.

Zum Abfragen prüfst Du den Ergebnistyp, wie in Javascript üblich (Ich müsste das erst nachschlagen).
 

mihe7

Top Contributor
Aber das Script funktioniert nicht...
Was genau funktioniert nicht?

In JavaScript gibt es keine ArrayList. Du kannst var output=Array(6); verwenden, dann push statt add und indexOf statt contains, wobei indexOf -1 liefert, falls das gesuchte Element nicht im Array enthalten ist.

Allgemein würde ich sagen, dass Du mit einer Variante von Knuths shuffle näher am echten Lotto wärst. Das kannst Du Dir mal als Zusatzaufgabe aufheben.
 

Oskar.p

Mitglied
Oh okey, dann habe ich es ja komplett versagt :D, also wie gesagt bin halt ein Anfänger, werde dem Set-Befehl nachgehen und das mit dem IndexOf versuchen.
 

Oskar.p

Mitglied
Also ich habe den Code jetzt abgeändert, sodass er die Zahlen (auch doppelte --> soll er aber nicht) ausgibt:
Javascript:
function generateOutput()
{
    var output = [];
    output.length = 7
    for (var a = 0 ; a < output.length ;a++)
    {
        output[a] = generateRandom(49);
    }

    document.getElementById("rdmOpt1").innerHTML = output[1];
    document.getElementById("rdmOpt2").innerHTML = output[2];
    document.getElementById("rdmOpt3").innerHTML = output[3];
    document.getElementById("rdmOpt4").innerHTML = output[4];
    document.getElementById("rdmOpt5").innerHTML = output[5];
    document.getElementById("rdmOpt6").innerHTML = output[6];
}

    document.getElementByID("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );

Ich versuche es irgendwie mit dem Set-Befehl, habe nur wiegesagt nicht soviel Ahnung.
 

M.L.

Top Contributor
Weiterhin muss man sich nicht auf die in PHP gelieferte random-Funktionalität verlassen (könnte ja sein, dass doch eine oder mehrere Zahlen mehrfach auftreten und man gerade deswegen mehr als 6 Anläufe einkalkulieren darf), Stichwort linearer Kongruenzoperator (mit modulo 50). Mit geeigneten Startwerten könnte auch die Anwendung von Set entfallen...
 

Oskar.p

Mitglied
Ich hab den Code nochmal abgeändert nur leider gibt dieser anstatt die Zahlen immer ein undefined aus:
Java:
function generateOutput()
{
    var output = [];
    var set = new Set(output);
    output.length = 7;
    
    for (var a = 0 ; a < output.length ;a++)
    {
        var rand =  generateRandom(49);
        if(set.has(rand))
        {
            a--;
        }
        else
        {
            set.add(rand);
        }
    }

    document.getElementById("rdmOpt1").innerHTML = output[1];
    document.getElementById("rdmOpt2").innerHTML = output[2];
    document.getElementById("rdmOpt3").innerHTML = output[3];
    document.getElementById("rdmOpt4").innerHTML = output[4];
    document.getElementById("rdmOpt5").innerHTML = output[5];
    document.getElementById("rdmOpt6").innerHTML = output[6];
}

    document.getElementByID("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );
 

mihe7

Top Contributor
Javascript:
var output = new Set();
while (output.size < 6) {
    output.add(generateRandom(49));
}
 

Oskar.p

Mitglied
und wie könnte ich diesen output mit einem andern input vergleichen, nach dem selben Prinzip? Also mein Ziel ist es Zahlen zu generieren und diese dann mit der Eingabe zu vergleichen, geht dies mit .has?
 

Oskar.p

Mitglied
Mache ich etwas mit der Ausgabe falsch? Es kommt immer ein undefined.
Javascript:
function generateOutput()
{
 
    var set = new Set();
    while(set.size < 6)
    {
        set.add(generateRandom(49));
    }
   

    document.getElementById("rdmOpt1").innerHTML = set[1];
    document.getElementById("rdmOpt2").innerHTML = set[2];
    document.getElementById("rdmOpt3").innerHTML = set[3];
    document.getElementById("rdmOpt4").innerHTML = set[4];
    document.getElementById("rdmOpt5").innerHTML = set[5];
    document.getElementById("rdmOpt6").innerHTML = set[6];
}

    document.getElementByID("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );
 

Oskar.p

Mitglied
Wie soll ich dass richtig ausgeben, tut mir leid wenn ich dauerhaft frage, leider habe ich halt nicht so viel Ahnung.
Java:
function generateOutput()
{
    var output = [set];
    var set = new Set();
    while(set.size < 6)
    {
        set.add(generateRandom(49));
    } 
    

    document.getElementById("rdmOpt1").innerHTML = output[1];
    document.getElementById("rdmOpt2").innerHTML = output[2];
    document.getElementById("rdmOpt3").innerHTML = output[3];
    document.getElementById("rdmOpt4").innerHTML = output[4];
    document.getElementById("rdmOpt5").innerHTML = output[5];
    document.getElementById("rdmOpt6").innerHTML = output[6];
}

    document.getElementByID("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Du könntest z. B. ein Array aus dem Set erzeugen:
Javascript:
var arr = Array.from(output)
 

M.L.

Top Contributor
Wie sieht eigentlich das aktuelle Projekt aus ? In der js-Funktion von #24 scheint
Javascript:
document.getElementByID("optBtn").addEventListener(click, function()
mit ById und "click" besser zu sein
 

Oskar.p

Mitglied
Das Projekt soll so aussehen: Du erhälts auf einer Website eine Tabelle , in der du 6 Tipps einträgst diese werden nun mit den Zufallsgenerierten ZAhlen verglichen und dementsprechend ausgegeben. Jetzt versuche ich erst mal das Problem zu lösen, dass keine zufällig generierten Zahlen erzeugt werden. Der "optBtn" ist ein Button der die Funktion ausführen soll.
 

Oskar.p

Mitglied
Du könntest z. B. ein Array aus dem Set erzeugen:
Nun sieht das Programm so aus und funktioniert immer noch nicht:
Java:
function generateOutput()
{
    var arr = Array.from(output);
    var output = new Set();
    while(output.size < 6)
    {
        output.add(generateRandom(49));
    } 
    

    document.getElementById("rdmOpt1").innerHTML = arr[1];
    document.getElementById("rdmOpt2").innerHTML = arr[2];
    document.getElementById("rdmOpt3").innerHTML = arr[3];
    document.getElementById("rdmOpt4").innerHTML = arr[4];
    document.getElementById("rdmOpt5").innerHTML = arr[5];
    document.getElementById("rdmOpt6").innerHTML = arr[6];
}

    document.getElementById("optBtn").addEventListener(click, function()
    {
        generateOutput();
    }
    );
 

mrBrown

Super-Moderator
Mitarbeiter
Jetzt versuche ich erst mal das Problem zu lösen, dass keine zufällig generierten Zahlen erzeugt werden. Der "optBtn" ist ein Button der die Funktion ausführen soll.

Tipp hast du doch schon bekommen:
In der js-Funktion von #24 scheint
Javascript:
document.getElementByID("optBtn").addEventListener(click, function()
mit ById und "click" besser zu sein

(Das war auch mit "aussehen des Projekts" gemeint)
 

Oskar.p

Mitglied
L
Java:
function generateOutput()
{
    var arr = Array.from(output);
    while(output.size < 6)
    {
        var output = new Set();
        output.add(generateRandom(49));
    } 
    
    

    document.getElementById("rdmOpt1").innerHTML = arr[0];
    document.getElementById("rdmOpt2").innerHTML = arr[1];
    document.getElementById("rdmOpt3").innerHTML = arr[2];
    document.getElementById("rdmOpt4").innerHTML = arr[3];
    document.getElementById("rdmOpt5").innerHTML = arr[4];
    document.getElementById("rdmOpt6").innerHTML = arr[5];
}

    document.getElementById("optBtn").addEventListener("click", function()
    {
        generateOutput();
    }
    );
eider geht es immer noch nicht und ich konnte die Zahlen bereits schon ausgeben, leider auch doppelte, weshalb ich Set benutzt habe und seit dem funktioniert gar nichts :/
 

mrBrown

Super-Moderator
Mitarbeiter
Die ersten Zeilen ergeben ja jetzt noch weniger Sinn als vorher 😅

Zeile 3: du erzeugst ein neues Array aus etwas nicht existierendem. arr ist dann ein leeres Array.
Zeile 4: du iterierst solange output.size < 6 ist, output ist allerdings noch gar nicht existent – also greifst du auf site von undefined zu (da sollte der browser schon einen Fehler schmeißen)
Zeile 5: du erstellst in jedem Zeilendurchlauf ein neues Set, und schmeißt damit natürlich auch das vorherige und dessen Inhalt weg.


Versuch die ersten Zeilen noch mal selbst:

Du musst erst ein (leeres) Set erstellen. Dieses dann solange füllen, bis es 6 Werte enthält (die dann garantiert verschieden sind). Aus dem Set mit dann 6 Werten erzeugst du danach das Array.
 

Oskar.p

Mitglied
Okey, habe immer noch einen Fehler 😅
Java:
function generateOutput()
{
   
    var output =new Set();
    while(output.size < 6)
    {
        output.add(generateRandom(49));
    }
    var arr = Array.from(output);
   
   

    document.getElementById("rdmOpt1").innerHTML = arr[0];
    document.getElementById("rdmOpt2").innerHTML = arr[1];
    document.getElementById("rdmOpt3").innerHTML = arr[2];
    document.getElementById("rdmOpt4").innerHTML = arr[3];
    document.getElementById("rdmOpt5").innerHTML = arr[4];
    document.getElementById("rdmOpt6").innerHTML = arr[5];
}

    document.getElementById("optBtn").addEventListener("click", function()
    {
        generateOutput();
    }
    );
 

M.L.

Top Contributor
immer noch nichts ausgegeben
Statt einer rein verbalen Beschreibung war gemeint, dass jemand Drittes das (aktuelle) Projekt nachstellen und Veränderungen vornehmen kann. Z.B.:
So sieht lotto.html aus:
HTML:
 //HTML-Code...
Das ist randomGenerate.js:
Javascript:
//JS-Code...
und generateOutput.js:
Javascript:
//JS-Code für zufallszahlen
Oder als (gezippten) Anhang, via repl.it / gist-Link (aktuelles YT-Video von D. Tielke )...
 

Oskar.p

Mitglied
Okey, hier ist nun mein Projekt:
HTML:
<!Doctype HTML>
  <head>
    <title>Casino</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=0.1">
    <link rel="icon" href="src/Diamond.png"> //einfach nur ein Icon für die Website
    <link rel="stylesheet" href="style.css" type="text/css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300&display=swap" rel="stylesheet">
    <script  src="src/generateRandom.js"></script>
    <script  src="src/generateOutput.js"></script>
  </head>

  <body>
    <section>
      <table id="rdmOpt">
        <tr>  <th>1</th>  <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> </tr>
        <tr>  <th id="rdmOpt1"></th> <th id="rdmOpt2"></th> <th id="rdmOpt3"></th> <th id="rdmOpt4"></th> <th id="rdmOpt5"></th> <th id="rdmOpt6"></th> </tr>
      </table>
      <table id="rdmIpt">
        <tr>  <th>1</th>  <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> </tr>
        <tr>  <th><input id="rdmIpt1"></th> <th><input id="rdmIpt2"></th> <th><input id="rdmIpt3"></th> <th><input id="rdmIpt4"></th> <th><input id="rdmIpt5"></th> <th><input id="rdmIpt6"></th> </tr>
      </table>
      <button id="optBtn" >Generate</button>
    </section>
  </body>

CSS:
body {
    background: rgb(88, 87, 87);
    font-family: 'Nunito', sans-serif;
    position: absolute;
    width: 100% auto;
    height: 100% auto;
}

input{
    width:1.1em;
}

#rdmOpt {
    border: white 0.2em solid;
    border-radius: 4px;
    color: white;
}

#rdmIpt {
    border: white 0.2em solid;
    border-radius: 4px;
    color: white;
}

[CODE lang="javascript" title="generateOutput"]function generateOutput()
{

var output = new Set();
while(output.size < 6)
{
output.add(generateRandom(49));
}
var arr = Array.from(output);





document.getElementById("rdmOpt1").innerHTML = arr[0];
document.getElementById("rdmOpt2").innerHTML = arr[1];
document.getElementById("rdmOpt3").innerHTML = arr[2];
document.getElementById("rdmOpt4").innerHTML = arr[3];
document.getElementById("rdmOpt5").innerHTML = arr[4];
document.getElementById("rdmOpt6").innerHTML = arr[5];
}

document.getElementById("optBtn").addEventListener("click", function()
{
generateOutput();
}
);[/CODE]

[CODE lang="javascript" title="generateRandom"]function generateRandom(maximum)
{
return Math.floor(Math.random()*maximum + 1);
}[/CODE]
 

M.L.

Top Contributor
Die gute Nachricht zuerst: der Code funktioniert nach einer kleinen Umstellung
Die schlechte Nachricht: der "Trick" ist nicht offensichtlich (stand aber im Link zu SO aus dem anderen Thread )...
Man befördert die zwei Zeilen zum Inkludieren der .js-Dateien nach unten:
HTML:
...
</section>
<script  src="src/generateRandom.js"></script>
    <script  src="src/generateOutput.js"></script>

  </body>
Mit Google Chrome könnte das nach Druck auf "Generate" dann so aussehen:
Lotto_erstes_Generate.pngLotto_zweites_Generate.pngLotto_drittes_Generate.png
 

Oskar.p

Mitglied
Danke, es funktioniert dieses mal wirklich! Dennoch hätte ich eine Frage, uns war : Warum muss man die .js Dateien nach unten inkludieren? Weil ich würde noch ein Script schreiben, dass die werte in dem einem Set auf Duplikate im anderen überprüft (dass man richtig geraten hat).
 

Oskar.p

Mitglied
wenn ich die Werte von dem Input in einem Array speichern könnte ich dies folgendermaßen machen:
Javascript:
    var input =[document.getElementById("rdmIpt1").value,
                document.getElementById("rdmIpt2").value,
                document.getElementById("rdmIpt3").value,
                document.getElementById("rdmIpt4").value,
                document.getElementById("rdmIpt5").value,
                document.getElementById("rdmIpt6").value,]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaScript - Array mit Objekten anhand des Object-keys sortieren Angular, React, JQuery - Fragen zu JavaScript 2
I JavaScript: Array umgekehrt von vorn auffüllen Angular, React, JQuery - Fragen zu JavaScript 7
B Angular Anzeigen von x Boxen die in Array gespeichert werden Angular, React, JQuery - Fragen zu JavaScript 0
8u3631984 React : 64 Byte Array in Image umwandeln Angular, React, JQuery - Fragen zu JavaScript 4
Zeppi Javascript JSON in ein Array Angular, React, JQuery - Fragen zu JavaScript 1
P Zufallsbilder aus Array mithilfe Button neu anzeigen lassen Angular, React, JQuery - Fragen zu JavaScript 2
iMrQuestion Eingebettete <iframe> mittels Konsole in Array speichern Angular, React, JQuery - Fragen zu JavaScript 6
B Quiz Fragen in einem Array nach drücken auf einen Button abfragen Angular, React, JQuery - Fragen zu JavaScript 5
J Werte aus 1D Array einzeln in ein 2D Array übergeben Angular, React, JQuery - Fragen zu JavaScript 5
T Wie kann man den code hier abändern, damit es "Array-werte" einliest und nicht Excelwerte? Angular, React, JQuery - Fragen zu JavaScript 2
T Lösung kenntlich machen im Array; text markieren Angular, React, JQuery - Fragen zu JavaScript 21
L JavaScript Array Angular, React, JQuery - Fragen zu JavaScript 4
E Java-Script (Array und Facebook geht nicht) Angular, React, JQuery - Fragen zu JavaScript 6
S Array mit JavaScript ausgeben Angular, React, JQuery - Fragen zu JavaScript 2
J Array Angular, React, JQuery - Fragen zu JavaScript 5
M Array Rückgabe wert an andere Funktion ? Angular, React, JQuery - Fragen zu JavaScript 2
M Array mit String Index ? Angular, React, JQuery - Fragen zu JavaScript 2
B Javscript schnell Duplikate finden? Angular, React, JQuery - Fragen zu JavaScript 2
W in Formular Radiobuttons überprüfen Angular, React, JQuery - Fragen zu JavaScript 6
S überprüfen ob neue post nachrrichten vorhanden sind Angular, React, JQuery - Fragen zu JavaScript 11
H Formulareingaben überprüfen Angular, React, JQuery - Fragen zu JavaScript 13

Ähnliche Java Themen


Oben