IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Výběr z množiny

Aktivity
Avatar
Richard Riči Šebek:28.11.2019 21:53

Tvořím aplikaci na procvičování převodů jednotek a vytvořil jsem množinu jednotek (zatím jen vzdálenost, ale chci více druhů), které se sami vybírají. Potřebuju aby se vygenerované jednotky nerovnaly, protože pak by příklad neměl smysl. Také potřebuji správně definovat vztah mezi jednotkami o kolik je daná jednotka vůči druhé menší/větší. Moc si s tím nevím rady, něco jsem hledal, něco jsem zkoušel... Doufám že mi tady poradíte :D

<!DOCTYPE HTML>
<html >
<head>

<title>Převodník jednotek</title>

</head>
<body>

<div id="container">
 <h1>Převodník jednotek</h1>

 <form action="#">
  <p>Převeď centimetry na metry. <br> Jako destinnou čárkou používej tečku.</p>
  <p>Příklad č. <a id="priklad">0</a></p>
  <input id="generated" type="text" readonly>
  <label id="zadani0"></label>
  <label> = </label>
  <input id="number" >
  <label id="zadani1"></label>
  <label id="spravny_vysledek" style="color:red;"></label>
  <label id="test"></label>
  <br>
  <p>Pokusy: <a id="pokus">0</a><br>
  Správně: <a id="spravne">0</a><br>
  Špatně <a id="spatne">0</a></p>
  <button id="button" type="button">Zkontrolovat</button>
  <br>
  <br>
  <button id="generovat" type="button">Generovat nový příklad</button>

 </form>
</div>

<script>

(function( d ) {
     d.getElementsByTagName( 'form')[0].reset();
     document.getElementById("generovat").addEventListener( "click" , generator );
     var priklad = 0;
     var pokus = 0;
     var spravne = 0;
     var spatne = 0;
     function generator(){
     priklad += 1;
     document.getElementById("priklad").innerHTML = priklad;

     var zadani = [
       "mm",
       "cm",
       "dm",
       "m",
       "km"
     ];

     var zadani0 = zadani[Math.floor(Math.random()*zadani.length)];
     var zadani1 = zadani[Math.floor(Math.random()*zadani.length)];
     if (zadani0 == zadani1) {
             zadani1 = zadani[0];
         }
     else if (zadani0 == zadani1) {
             zadani1 = zadani[2];
         }
     else {
         }

     d.getElementById("zadani0").innerHTML = zadani0;
     d.getElementById("zadani1").innerHTML = zadani1;
     d.getElementById( 'generated' ).value = Math.floor(( Math.random() * 10001 ) - 5000) / 10;
     d.getElementById("spravny_vysledek").innerHTML = "";
     d.getElementById("number").value = "";
     d.getElementById("test").innerHTML = "";
     };
     d.getElementById( 'button' ).addEventListener( 'click',
     function() {
     pokus += 1;
     document.getElementById("pokus").innerHTML = pokus;
                var x = d.getElementById( 'generated' ).value;
            var y = d.getElementById( 'number' ).value;
            var z = 1;
            var a = x / z;
            var jednotka = d.getElementById("zadani1").innerHTML;
         if ( a == y ) {
             text = "✔";
             vysledek = "";
             spravne += 1;
         }
         else {
             text = "✘";
             vysledek = "Správný výsledek je " + a + " " + jednotka;
             spatne += 1;
         }
         document.getElementById("test").innerHTML = text;
         document.getElementById("spravny_vysledek").innerHTML = vysledek;
         document.getElementById("spatne").innerHTML = spatne;
         document.getElementById("spravne").innerHTML = spravne;
         }, false );
}( document ));
</script>

</body>
</html>
 
Odpovědět
28.11.2019 21:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.11.2019 8:32
function $(id) {return document.getElementById(id);} // to by ti tam zjednodusilo praci...
function rnd(n) {return Math.floor(Math.random()*n);}
x = zadani.length; // nepouzivej opakovane pole.length, pokud ti zalezi na rychlosti
a = rnd(x)
b = rnd(x)
while (a==b) {b = rnd(x)} // jenze to muze provest treba 1-1000 opakovani takze by mozna bylo lepcejsi...
if (a==b) {b = (b+1+rnd(x-1)) % x}
// cili b+1, aby posun byl min +1
// rnd(x-1), aby posun nebyl max protoze by ses dostal na zacatek
// % x je zbytek po celeciselne deleni, to funguje tak, ze vraci f(cislo, x) = 0 az x-1 = (cislo/x - floor(cislo/x)) * x

Zkratka % funguje takto

x = 3
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2 // 2/3 = 0, zbytek 2
3 % 3 = 0 // 3/3 = 1, zbytek 0
4 % 3 = 1
5 % 3 = 2

A ten posun

x = 3
a = 1
b = 1
---
b+1 = 2
rnd(x) kdyby ti vyslo 2, cili max hodnota
b+1+2 = 2+2 = 4
4 % 3 = 1 == a, coz se rovna puvodne 'a' a tos nechtel, tak proto rnd(x-1)
---
b + 1 proto, ze rdn vychazi i 0, takze by mohl nastat pripad
b + rnd(x-1) = b + 0
Editováno 29.11.2019 8:34
 
Nahoru Odpovědět
29.11.2019 8:32
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:29.11.2019 10:15

Ahoj, jen mě napadlo, jestli by nebylo jednodušší:
krok 1...zamíchat pole s jednotkama
krok 2. zadani 1...pole[0] zadani 2...pole[1]

 
Nahoru Odpovědět
29.11.2019 10:15
Avatar
Richard Riči Šebek:2.12.2019 20:15

Díky za rady, vykoumal jsem to trošku jinak, ale pomohli jste mi. Ještě bych ale potřeboval nějak definovat vztahy mezi jednotkama. Ve smyslu že 1 m = 100 cm atd... Mám řešení s podmínkou, ale řekl bych že to je přímo prasácký xD. Uvítal bych rady :D

 
Nahoru Odpovědět
2.12.2019 20:15
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.12.2019 7:52

Pouzij tabulku osami x-x, to mi prijde jednoduche, prehledne, snadno doplnitelne treba o prevody u prace na joule-watt.
.001 = 1e-3
1000 = 1e3
1000000 = 1e6

 
Nahoru Odpovědět
3.12.2019 7:52
Avatar
Odpovídá na Peter Mlich
Richard Riči Šebek:3.12.2019 12:48

Jo, ty hodnoty takhle mám vymyšlený... Ale nevím teda o té tabulce, zkusím zagooglit, ale kdyby si mi ji dal třeba pro vzdálenost, byla by to ideálka :D

 
Nahoru Odpovědět
3.12.2019 12:48
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.12.2019 16:02

No, tabulku x-x. Nevim, jak to rici jinak. Bud mas tabulku x+radky nebo x-y nebo jinou. popisky z x pouzijes pro y. Jsem teda predpokladal asi mysle, ze umis tabulku zapsat do js array.

y\x    mm   cm  dm
mm  0       0.1  0.01
cm   10     0      0.1
dm   100  10       0

y = dm z jednotek
x = mm do jednotek
nasobek = tab[y][x] = 100

// zapisuje se to takto
// tab = []
// tab[2] = []
// tab[2][0] = 100
// nebo
// tab = []
// tab[2] = [100, 10, 0, 0.1]
// nebo
tab = [
[0, 0.1, 0.01],
[10, 0, 0.1, 0.01], // v podstate zkopirujes radek a pred prvni cislo napises nove; cisla na konci nemusis mazat
[100, 0, 0.1, 0.01] // posledni je bez carky
]
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.12.2019 16:02
Avatar
Odpovídá na Peter Mlich
Richard Riči Šebek:3.12.2019 16:18

Já nejsem tak znalej :D ale díky za pomoc :D

 
Nahoru Odpovědět
3.12.2019 16:18
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.