View Full Version : [LOGICA BOOLEANA] IMPORTANTE Non mi tornano i conti
Allora.. o io sono stupido........ o veramente qualcosa non torna.....
Se io uso questo enunciato:
do {
first = (int) (Math.random() * dim.getWidth()) - (2 * raggio);
second = (int) (Math.random() * dim.getWidth()) - (2 * raggio);
System.out.println("Primo: " + first);
System.out.println("secondo: " + second);
} while (first == 1 && second == 1);
Come dovrebbe funzionare?
In teoria esce dal do-while quando entrambi i valori sono uguali a 1...
Esatto?
In realtà mi calcola questi:
Primo: -40
secondo: -40
Primo: 214
secondo: 508
Primo: 149
secondo: 424
Primo: 129
secondo: 233
...
NB: Comunque il codice postato è in java.
dim.getWidth() restituisce 600
2*Raggio restituisce 40
banryu79
26-06-2008, 14:38
In teoria esce dal do-while quando entrambi i valori sono uguali a 1...
Esatto?
Sbagliato, fa esattamente il contrario.
Esegue una prima volta il blocco di codice specificato tra parentesi dopo il "do" per poi verificare che l'espressione contenuta nel "while" sia TRUE.
Se è TRUE allora esegue nuovamente il blocco "do" altrimenti esce dal ciclo.
Ne tuo caso esce subito (dopo un'esecuzione).
Forse volevi usare l'operatore booleano "!=", non "==" dentro il while.
Forse dovrebbe fare così.... Ma se io metto in questo modo:
do {
first = (int) (Math.random() * dim.getWidth()) - (2 * raggio);
second = (int) (Math.random() * dim.getWidth()) - (2 * raggio);
System.out.println("Primo: " + first);
System.out.println("secondo: " + second);
System.out.println();
} while (first != 1 && second != 1)
Ecco il risultato:
Primo: -40
secondo: -40
Primo: -40
secondo: -40
Primo: -40
secondo: -40
Primo: -40
secondo: -40
Primo: -40
secondo: -40
Primo: -40
secondo: -40
E questo all'infinito ovviamente.. :D :D
banryu79
26-06-2008, 14:46
Scusa,
allora temo di non aver capito che cosa cerchi di ottenere in quel blocco di codice.
Puoi spiegarmi?
Ciò che volevo fare è semplice.
Far calcolare due numeri random maggiori di 0.
Il codice che ho scritto sopra era uno degli esperimenti di disperazione..
do {
double firstTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
first = (int) firstTemp;
double secondTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
second = (int) secondTemp;
System.out.println("Primo: " + first);
System.out.println("secondo: " + second);
} while (first >= 1 && second >= 1);
Questo è quello che sto testando in questo momento..
Secondo la mia logica dovrebbe:
Eseguire il campo "do"
Verificare se la condizione è esatta. (Ovvero entrambi i numeri MAGGIORI-UGAULI a 1)
Se è soddifatta esce e fine
Altrimenti riccalcola....
Ciò che mi mette in crisi è che calcoli sempre "-40" se uso "!="....... O_O
AIUTAMIII!!!
:cry: :cry: :cry: :cry: :cry: :cry: :cry:
andrew1988
26-06-2008, 15:26
ma che strano.. anche io l'ho implemenato e da gli stessi problemi... mmmmhh...
la motivazione per cui ti ritorna sempre -40 è semplice:
perchè il dim.getWidth() ti ritorna 0 :D
la motivazione per cui ti ritorna sempre -40 è semplice:
perchè il dim.getWidth() ti ritorna 0 :D
per logica quel che dici è giusto....
Ma sai spiegarmi perché?
Poichè il dim.getWidth() in tutto il resto del programma funziona....
E *sembrerebbe* non funzionare SOLO se metto un "not"......
curiosità,ma che cos'è dim?e come l'hai settato?
ti spiego la mia curiosità:
se hai usato un container allora il problema è come l'hai settato(se hai hai usato setPreferredSize oppure setSize).
se invece hai usato una semplice dimension allora nn so che dirti perchè a me funziona
NB: Comunque il codice postato è in java.
dim.getWidth() restituisce 600
2*Raggio restituisce 40
Mi quoto da solo...
Comunqe dim è un JFrame.....
cosa intendi con "come è settato??"
EDIT:
Le dimensioni funzionano di sicuro....
Xke uso dim.getWidth() per altre cose e quelle funzionano.. :P
beh,allora usando dim.setSize(...) dovrebbe funzionare.o perlomeno a me funziona.se poi usi setPreferredSize(...) mi da il tuo stesso risultato cioè -40 all'infinito
Beh, purtroppo a me no...
Altrimenti come mi spieghi questi valori di uscita:
a)
Primo: 246
secondo: -22
b)
Primo: 554
secondo: -10
c)
//questo va bene.. :P
Primo: 0
secondo: 496
:D :D
Eccoti per esempio il while completo:
Entrato...
Primo: 5
secondo: 99
Primo: 93
secondo: 419
Primo: 503
secondo: 457
Primo: 503
secondo: 233
Primo: 538
secondo: 439
Primo: 435
secondo: 31
Primo: 18
secondo: 99
Primo: 507
secondo: 192
Primo: 349
secondo: 275
Primo: 250
secondo: 327
Primo: 361
secondo: 475
Primo: 540
secondo: 258
Primo: 396
secondo: 431
Primo: 246
secondo: -22
Uscito dal while
Come vedi non ha molto senso..
Con "while (first >= 1 && second >= 1)".........
Doveva uscire già al primo passaggio... poichè:
(5 >= 1 && 5 >= 1)
(5 > 1 && 5 > 1)
(true && true)
(true)
in qst caso il tuo problema qual'è?che escono numeri negativi?beh,mi pare ovvio che se usi "!=" significa diverso da 1,cioè minore o maggiore di 1(quindi anche numeri negativi).se nn vuoi numeri negativi non povrai usare il "!=" ma il maggiore uguale.sempre se è qst qllo che mi hai chiesto,altrimenti nn ho capito il problema :P
ah,ora ho capito :D
qlla nel while nn è una condizione per uscire,ma restare nel ciclo.quindi se tu >= allora,ti resterà nel ciclo fino a qnd nn troverà dei valori negativi o pari a zero
in qst caso il tuo problema qual'è?che escono numeri negativi?beh,mi pare ovvio che se usi "!=" significa diverso da 1,cioè minore o maggiore di 1(quindi anche numeri negativi).se nn vuoi numeri negativi non povrai usare il "!=" ma il maggiore uguale.sempre se è qst qllo che mi hai chiesto,altrimenti nn ho capito il problema :P
hem.... leggi il post per intero.......
:rolleyes:
e comunque.. anche se fosse:
while (first >= 1 && second >= 1)
sarebbe dovuto uscire al primo tentativo....
poichè:
while (99 != 1 && 5 != 1)
while (true && true)
while (true)
!!!!!!!
EDIT:
Ok, ma allora se io dico:
while (!(primo >= 1) && !(primo == 1))
questi valori non hanno senso:
Primo: 26
secondo: -8
Primo: 168
secondo: -6
ah,ora ho capito :D
qlla nel while nn è una condizione per uscire,ma restare nel ciclo.quindi se tu >= allora,ti resterà nel ciclo fino a qnd nn troverà dei valori negativi o pari a zero
ti avevo risp già appena ho capito di nn aver letto tutta la tua risposta :P
Una possibile risposta e' che
Math.Random restituisce un double tra 0 e 0.9999999999
mentre dim.getWidth() restituisce un intero
e c'e' un bel cast implicito non segnalato dal compilatore Java (o forse si' e non l'hai letto) che trasforma il double in intero prima di moltiplicare i valori.
quindi sempre zero.
Co questo codice:
do {
double firstTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
first = (int) firstTemp;
double secondTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
second = (int) secondTemp;
System.out.println("Primo: " + first);
System.out.println("secondo: " + second);
} while (!(first >= 1) && !(second >= 1));
E con queste impostazioni esce dal ciclo con questi valori:
a)
Primo: -11
secondo: 367
b)
Primo: 168
secondo: -6
c) //va *per caso* anche bene
Primo: 67
secondo: 91
d)
Primo: 26
secondo: -8
ecc.....
Io proprio non me lo spiego.. ç__ç
ti avevo risp già appena ho capito di nn aver letto tutta la tua risposta :P
si ho letto dopo e ho modificato la mia risp di sopra. :P
Co questo codice:
do {
double firstTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
first = (int) firstTemp;
double secondTemp = (Math.random() * dim.getWidth()) - (2 * raggio);
second = (int) secondTemp;
System.out.println("Primo: " + first);
System.out.println("secondo: " + second);
} while (!(first >= 1) && !(second >= 1));
E con queste impostazioni esce dal ciclo con questi valori:
a)
Primo: -11
secondo: 367
b)
Primo: 168
secondo: -6
c) //va *per caso* anche bene
Primo: 67
secondo: 91
d)
Primo: 26
secondo: -8
ecc.....
Io proprio non me lo spiego.. ç__ç
Scusa ma che c'è di strano?
Appena uno dei due è minore di 1 si esce dal ciclo.
Se vuoi che vada "sempre" come nel caso c), ossia uscita quando entrambi sono positivi, devi usare or.
stavo rispondendoti col mio ragionamento logico....
Ma mentre ti scrivevo mi sono reso conto ce in effetti.. :D :D
L'idea è giusta.. ASD ASD
:muro: :muro:
Thanks.. LOL
per come hai impostato la condizione,per continuare il ciclo dovrebbero essere tutte e due negativi per far diventare la condizione true.
prendi il caso a:
while(!(-11>=1)&& !(367>=1)
la prima ti darà true,la seconda false,che con la condizione di and fa false,e quindi esce dal ciclo.
si, l'errore che ho fatto di base era credere che uscisse dal do con true...
Poi solo confusione nella logica di bool.....
Che non è per nulla semplice da "pensare" basta una cavolata e ti confondi...
Grazie ancora al forum k come al solito mi aiuta.. :D :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.