PDA

View Full Version : [LOGICA BOOLEANA] IMPORTANTE Non mi tornano i conti


jj.69kt
26-06-2008, 14:30
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.

jj.69kt
26-06-2008, 14:42
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?

jj.69kt
26-06-2008, 14:56
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...

smart83
26-06-2008, 15:31
la motivazione per cui ti ritorna sempre -40 è semplice:
perchè il dim.getWidth() ti ritorna 0 :D

jj.69kt
26-06-2008, 15:41
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"......

smart83
26-06-2008, 15:43
curiosità,ma che cos'è dim?e come l'hai settato?

smart83
26-06-2008, 16:00
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

jj.69kt
26-06-2008, 16:01
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

smart83
26-06-2008, 16:06
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

jj.69kt
26-06-2008, 16:19
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)

smart83
26-06-2008, 16:26
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

smart83
26-06-2008, 16:28
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

jj.69kt
26-06-2008, 16:29
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

smart83
26-06-2008, 16:31
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

gugoXX
26-06-2008, 16:31
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.

jj.69kt
26-06-2008, 16:39
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.. ç__ç

jj.69kt
26-06-2008, 16:40
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

Albi89
26-06-2008, 16:45
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.

jj.69kt
26-06-2008, 16:53
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

smart83
26-06-2008, 16:53
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.

jj.69kt
26-06-2008, 17:11
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