NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: omezení duplicitního generování čísel

V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Bezecný:8.2.2018 17:08

Dobrý večer, měl bych takový menší dotaz ...

Jak lze zabezpečit, aby nebylo 2x stejné vygenerované číslo?
Děláme s kamarádem v JS, generujeme otázky(číslo) a nechceme, aby se otázky opakovaly?
Nějaký návrh vyřešení tohoto problému?

Předem děkuji

 
Odpovědět
8.2.2018 17:08
Avatar
Odpovídá na Tomáš Bezecný
Martin Konečný (pavelco1998):8.2.2018 17:11

Ahoj,
pokud se jedná o generování čísel bez následného obnovení stránky, pak bych si udělal pole, kam bych si jednotlivá čísla postupně ukládal a při generování nového zjišťoval, zda již není obsažené v tom poli.

Pokud by to bylo i s obnovením, dá se pro dočasné uložení použít např. localStorage nebo cookies.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.2.2018 17:11
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Tomáš Bezecný:8.2.2018 18:27

Nějaký podrobnější popis? Zkoušel jsem to, ale nefungovalo mi to.

Mám:
var otazky=[otazka1,o­tazka2,otazka3,o­tazka4,...];
var odpovezene=[];

generování čísla

var nc1=Math.random();
nc1=nc1*25+1;
nc1=Math.floor(nc1);
setTimeout(otaz­ky[nc1],1000);

co mám do kódu dopsat, aby to hodilo vygenerovanou otázku do pole odpovezeno a generovalo znovu?

Děkuji

PS: jedná se o generování čísel BEZ obnovy stránky

Editováno 8.2.2018 18:27
 
Nahoru Odpovědět
8.2.2018 18:27
Avatar
Peter Sciranka
Tvůrce
Avatar
Odpovídá na Tomáš Bezecný
Peter Sciranka:8.2.2018 23:28

Ahoj, šlo by to nejak takto:

var otazky=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var odpovezene = [];

var pocetOtazok = otazky.length;
// cyklus, ktery projede a náhodne vybere otazky z pole "otazky"
for(var i = 0; i<pocetOtazok; i++){
    // vybere náhodnou otázku z pole "otazky"
    var otazka = Math.floor(Math.random()*otazky.length);
    // vloží otázku do pole "odpovezene"
    odpovezene.push(otazky[otazka]);
    // odstrani danou otázku z pole "otazky"
    otazky.splice(otazka,1);
};

Prispôsobil som tvoj kód tomu, čo asi potrebuješ, tak sa na to skús pozrieť, ak by niečo, tak napíš :)

Nahoru Odpovědět
8.2.2018 23:28
Act as if it was Impossible to Fail
Avatar
Cobis
Člen
Avatar
Cobis:9.2.2018 14:29

Pokud je každá položka v poli otázek jedinečná, pak stačí pole náhodně promýchat a dát hadajícímu pouze první část pole. Zkusil bych to takto, ale jde to jednodušeji záleží na okolnostech.

var pocetOtazek = 5;
var otazky = [1,2,3,4,5,6,7,8,9,10];
// kopiruje pole otazek
var kpoieOtazky = [].concat(otazky);
// nahodne seradi polozky v poli
kpoieOtazky.sort(function (polozkaA, polozkaB) {return (Math.random() < 0.5) ? -1 : 1;});
// rozsekne pole nahodne serazenych otazek na otazky pro hadajiciho a zbytek
var otazkyProHadajiciho = kpoieOtazky.splice(0, pocetOtazek);

console.log(otazky);
console.log(kpoieOtazky);
console.log(otazkyProHadajiciho);
 
Nahoru Odpovědět
9.2.2018 14:29
Avatar
John Ronald Reuel Tolkien:10.2.2018 13:58

Zdravím, já jsem ten kamarád, se kterým vytváří tu hru. :D
Abych to objasnil, máme hru milionář, v každé otázce jsou na výběr vždy čtyři možnosti. Jestliže odpovíte zprávně zavolá se tato funkce
function prepni ()
{

for (var i=1;i<pocetOta­zek;i++)
{
var nc1=Math.random();
nc1=nc1*pocetO­tazek;
nc1=Math.floor(nc1);
odpovezene.push(o­tazky[nc1]);
otazky.splice(nc1,1);

setTimeout(otaz­ky[nc1],1000);
setTimeout(fun­ction(){ vynuluj(); }, 1000);
} }
Je už upravená podle Vaší rady.
Avšak když se dostanu k 4 otázce, opakuje se stále dokola, nevím proč.

Editováno 10.2.2018 13:59
 
Nahoru Odpovědět
10.2.2018 13:58
Avatar

Člen
Avatar
:10.2.2018 14:33

Myslím, že najjednoduchší approach k tomu vedie cez array.splice() metódu. Na zhruba tento spôsob:

// vytvor pole otázok
var questions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// a toto vykonávaj opakovane - vyber a odstráň otázku
var randomIndex = Math.floor(Math.random() * questions.length)
var randomQuestion = questions.splice(randomIndex, 1)

Inými slovami, z existujúcich indexov vyber jeden náhodne a vždy ho odstráň z poľa. Tak sa ti otázka určite nebude nikdy opakovať a nemusíš ani len skúmať či tam náhodou nie je.

 
Nahoru Odpovědět
10.2.2018 14:33
Avatar

Člen
Avatar
:10.2.2018 14:43

Test:

var questions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

var unanswered = questions.slice(0) // copy array trick
var answered = []

for (var i = 0; i < questions.length; i++) {
  var randomIndex = Math.floor(Math.random() * unanswered.length)
  var randomQuestion = unanswered.splice(randomIndex, 1)
  answered.push(randomQuestion)
}

document.write(answered)
 
Nahoru Odpovědět
10.2.2018 14:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.