Diskuze: Generovaní náhodných čísel atd.
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, problém je v tom, že si pokaždé vytvoříš novou instanci třídy
random, která má pokaždé stejný seed (počáteční hodnoty), jelikož seed
se obvykle bere z aktuálního času. Udělej si jen jednu instanci třídy
random a používej ji všude
Takže jestli to chápu dobře, mám docílit toho, co se bralo v tutoriálu a tzv. jednu kostku tahat pořád sebou? Chtěl jsem právě, aby měl každá proměnná svůj generátor. Protože mi úplně nesedí ,že když změním hodnotu jedné instance třídy random, změní se mi hodnota všude.
Změnil jsem třídu Klub a Zapas a abych se přiznal tak nechápu co to
vlastně ted dělá
zřejmě to už projíždí cyklem vícekrát s různými čísly ale zase
nefungují podmínky
.
package fotbal.manager.pkg001;
import java.util.Random;
public class Klub {
private Random random;
public String jmeno;
public int zaloha;
public Klub(String jmeno){
this.jmeno=jmeno;
zaloha= 6;
random=new Random();
}
public int prihraj(){
return random.nextInt(zaloha);
}
@Override
public String toString(){
return jmeno+" "+prihraj();
}
}
package fotbal.manager.pkg001;
public class Zapas {
public Klub domaci;
public Klub hoste;
public int scoredomaci;
public int scorehoste;
public Zapas(Klub domaci,Klub hoste){
this.domaci = domaci;
this.hoste = hoste;
}
public int hraj(){
scoredomaci=0;
scorehoste=0;
for (int i = 1; i<5;i++){
if (domaci.prihraj()>hoste.prihraj())
{
scoredomaci += 1;
}
else if (domaci.prihraj()<hoste.prihraj())
{
scorehoste += 1;
}
}
return scoredomaci + scorehoste;
}
@Override
public String toString(){
return domaci.jmeno+" "+scoredomaci+" : "+scorehoste+" "+hoste.jmeno;
}
}
Tady porad vytvaris pro kazdy klub novou instanci randomu, klidne si tu kostku udelej jen jednou a statickou.
Oni fungují, jen nedělají to co bys chtěl...
if (domaci.prihraj()>hoste.prihraj())
{
scoredomaci += 1;
}
else if (domaci.prihraj()<hoste.prihraj())
{
scorehoste += 1;
}
Ty totiž házíš znovu kostkou v případě, že domácí prohráli a
tudíž se ti pak stane, že vyhrajou a ty ani jednou nic nepřičteš.
Před testováním si ulož hozené hodnoty a pak testuj podmínky.
int domaciHod=0;
int hosteHod=0;
...
for(...
domaciHod=domaci.prihraj();
hosteHod=hoste.prihraj();
if (domaciHod>hosteHod)
{
scoredomaci += 1;
}
else if(domaciHod>hosteHod)
{
scorehoste += 1;
}
Snad je to ono...
To už jsem jednou zkoušel pro jistotu jsem to udělal znova ale program
padá.Píše něco o Null hodnotě a pointerech ale tomu já ještě nerozumím.
"Nějak nemůžu docílit toho, aby to vždycky vygenerovalo nové čísla do cyklu"
Zkus si položit na tuto část věty otázku.
Kdy generuješ nové číslo? (najdi si v kódu, kdy generuješ v kódu číslo)
a tím i zjistíš, proč ti to negeneruje nové číslo v cyklu.
(Rada do budoucna. Toto je bohužel ta nejhorší ze tří chyb - logická.
Pokud Prostě program nedělá to, co chceš a ani nepíše žádnou chybu, tak
se musíš takhle ptát. Proč to nedělá co má a co vlastně chci, aby to
dělalo).
Přiznám se, že jsem doteď nepochopil tu spojitost mezi původním
zněním zadání a pak tím kódem.
Když bych to vzal z původního zadání:
Snažil jsem se udělat program, který by vygeneroval mezi sebou dvě náhodné čísla a ty pak porovnal mezi sebou. Pokud by jedno bylo větší přičetl by +1 do proměnné třeba a v opačném případě do b. při rovnosti nic. Snažil jsem se to naprogramovat pomocí OOP a vše funguje jak jsem popsal. Ovšem když to dám do cyklu tak to vygeneruje jednou náhodně a pak to vezme první náhodné generování. Nějak nemůžu docílit toho, aby to vždycky vygenerovalo nové čísla do cyklu tak že mám vždy jen tři výsledky.(1:0,0:1 nebo 0:0)
Tak by kód vypadal asi takhle nějak:
import java.util.Random;
public class Generator {
private final Random random = new Random();
private int firstNumber;
private int secondNumber;
private int firstNumberWinsCounter;
private int secondNumberWinsCounter;
//konstruktor
public Generator() {
generateNumbers();
output();
}
//přístupové metody
public int getFirstNumber() {
return firstNumber;
}
public void setFirstNumber(int firstNumber) {
this.firstNumber = firstNumber;
}
public int getSecondNumber() {
return secondNumber;
}
public void setSecondNumber(int secondNumber) {
this.secondNumber = secondNumber;
}
public int getFirstNumberWinsCounter() {
return firstNumberWinsCounter;
}
public int getSecondNumberWinsCounter() {
return secondNumberWinsCounter;
}
//metody
private void increaseFirstNumberWins() {
firstNumberWinsCounter++;
}
private void increaseSecondNumberWins() {
secondNumberWinsCounter++;
}
private void output() {
System.out.println(getFirstNumberWinsCounter());
System.out.println(getSecondNumberWinsCounter());
}
private void generateNumbers() {
setFirstNumber(random.nextInt(10));
setSecondNumber(random.nextInt(10));
if (getFirstNumber() > getSecondNumber()) {
increaseFirstNumberWins();
} else if (getSecondNumber() > getFirstNumber()) {
increaseSecondNumberWins();
}
}
//main
public static void main(String[] args) {
new Generator();
}
}
No a potom stačí dát v konstruktoru metodu generateNumbers(); do cyklu a měl bys mít kýžený výsledek.
import java.util.Random;
public class Generator {
private final Random random = new Random();
private int firstNumber;
private int secondNumber;
private int firstNumberWinsCounter;
private int secondNumberWinsCounter;
//konstruktor
public Generator() {
for (int i = 0; i < 10; i++) {
generateNumbers();
}
output();
}
//přístupové metody
public int getFirstNumber() {
return firstNumber;
}
public void setFirstNumber(int firstNumber) {
this.firstNumber = firstNumber;
}
public int getSecondNumber() {
return secondNumber;
}
public void setSecondNumber(int secondNumber) {
this.secondNumber = secondNumber;
}
public int getFirstNumberWinsCounter() {
return firstNumberWinsCounter;
}
public int getSecondNumberWinsCounter() {
return secondNumberWinsCounter;
}
//metody
private void increaseFirstNumberWins() {
firstNumberWinsCounter++;
}
private void increaseSecondNumberWins() {
secondNumberWinsCounter++;
}
private void output() {
System.out.println(getFirstNumberWinsCounter());
System.out.println(getSecondNumberWinsCounter());
}
private void generateNumbers() {
setFirstNumber(random.nextInt(10));
setSecondNumber(random.nextInt(10));
if (getFirstNumber() > getSecondNumber()) {
increaseFirstNumberWins();
} else if (getSecondNumber() > getFirstNumber()) {
increaseSecondNumberWins();
}
}
//main
public static void main(String[] args) {
new Generator();
}
}
Jinak:)
To cos napsal o NullPointerExceptionu:) To neznamená Null pointerů:)
Toto je jedna z nejčastějších chyb v programování. NullPointerException
= Chyba, ukazuješ na nevytvořený objekt (na instanci s null hodnotou).
Abys pochopil smysl této chyby, tak je to, jako kdybys chtěl v reálném
životě něco po něčem, co neexistuje.
Kupříkladu kdybys stál vedle 3 lidí (Libor, Luboš, Lubor) a řekneš
jim:
"Lubomíre, udělej tři kroky dopředu"
Tak ti pán bůh řekne:
"Pitomče, Lubomír neexistuje"
V podstatě Java ti to říká úplně stejně. Ty kupříkladu chceš na nějaký objekt zavolat jeho metodu, ale ten objekt ještě neinicializuješ (nevytvoříš jej). Například bys takovou chybu mohl získat takto:
Random random;
random.nextInt();
Když tento kód provoláš v main metodě, tak ti to vrátí
NullPointerException.
Prostě ti to řekne, že voláš metodu nextInt na objekt random, který ale
neexistuje. Tys jen řekl, že to někdy bude instance typu Random, ale ta
instance neexistuje, protože jsi ji nevytvořil.
Tak to je asi celková podstata NullPointerException. Je to častá a nepříjemná chyba, ale jedna z nejjednodušších, protože víš, že v nějaké části programu nemáš vytvořený objekt, ale voláš na něj metodu.
Random random;
random.nextInt();
Něco takového ti ani neprojde kompilátorem.
Random random = null;
random.nextInt();
Tahle už kompilátorem projde a při běhu to konečně vyhodí tu velice oblíbenou výjimku.
Všem děkuji za odpovědi a pomoc. Poopravil jsem svůj program a díky radám co jste mi daly to už funguje. Nicméně, když tak zůstaňte na příjmu určitě budu mít jiný problém. Jo a jinak udělal jsem to bez těch setterů a getterů, protože tak daleko ještě nejsem, tak pracuji s tím co znám teda alespoň si myslím, že to znám. A to je po lekci cca OOP 3. Tak že ještě jednou děkuji za pomoc.
Zobrazeno 13 zpráv z 13.