Newsgroup: it.comp.java
Titolo: Domanda forse banale (scusate)

Scusate, domanda magari banale....
sto cercando di usare il costruttore BigInteger:
BigInteger(n° bit, random) per generare un array casuale di 64 byte..
Scrivo (new BigInteger(512, (new random()))).getBytes()... a volte ottengo 
64 byte a volte 65...
Cosa sbaglio????
Grazie mille! 

 Cosa sbaglio????
Posta il codice in modo che sia compilabile (o almeno corretto), se no 
non si capisce niente.
Mi chiedo come fa a funzionarti dato che un metodo getBytes() non lo 
trovo nella documentazione:
http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html
Cerco di interpretare quello che dici: forse intendi che
   new BigInteger(512, new Random()).toByteArray().length
da risultati diversi ogni volta. Beh, è normale. Dato che BigInteger 
decide da solo quanti byte usare
O forse usi
    new BigInteger(512, new Random()).bitLength()
Anche in questo caso è normale, perché il primo parametro del 
costruttore è :
      numBits - maximum bitLength of the new BigInteger.
mentre il risultato di bitLength() è
     number of bits in the minimal two's-complement representation of 
this BigInteger, excluding a sign bit.
Quindi 512 è il numero massimo di bit da usare, il risultato di 
bitLength è il numero minimo di bit necessari per rappresentare il 
numero scelto dall'oggetto Random. Se l'oggetto Random sceglie "1" 
bastera un bit, se l'oggetto Random sceglie 7 ne serviranno 3 e così 
via. Sicuramente l'oggetto random non scegliera mai 2.34078079 * 10^154 
perché per quello servono più di 512 bits.
La prossima volta che hai un dubbio su un metodo ricordati che la Sun 
fornisce delle pagine di documentazione molto chiare. Si trova cercando 
"BigInteger se 6" su google, oppure installandosi il JavaDoc sul tuo IDE.
La prossima volta che chiedi scrivi correttamente il codice di cui 
parli, semplificherai la vita a chi ti legge e ti risponde (a tal 
proposito guardati 
http://mindprod.com/jgloss/sscce.html
).
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html
 

 Mi scuso, cerchero' di pensarci dieci volte prima di postare.
Non è necessario pensarci dieci volte. E nel tuo interesse essere chiaro 
e preciso, per aumentare la probabilità di ricevere risposte e per 
aumentare la probabilità che siano le risposte giuste.
A tal proposito 
http://mindprod.com/jgloss/newsgroups.html
 contiene 
molti consigli per usare la meglio usenet.


il 28/09/2008 20.51, Scrive max 46300184:

... di sicuro il metodo getBytes().
Se invece intendi toByteArray(), allora probabilmente la variazione da 
64 a 65 e' dovuta al fatto che ti torna un extra bit per il segno, per 
non rendere negativo il numero (il costruttore che usi genera sempre 
numeri non negativi), che sconfina nel 65mo byte. Per evitare il 65mo 
byte usa BigInteger(511, ...
-- 
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'

     bitLength()


 costruttuore il numero è sempre non-negativo (da 0 a 2^numBits - 1).
Da da 0 a 2^numBits - 1, quando numBits vale 512, puo' ospitare un 
numero fino a ((2^512) - 1) ovvero 64 byte pieni di FF; per mettere il 
segno ho bisogno di un extra bit, e quindi il 65mo byte, altrimenti il 
numero e' negativo, essendo acceso il primo bit che invalida l'assunto 
che il numero sia sempre non-negativo.
Io l'ho capito cosi', poi posso sbagliare, ovviamente.


 
Ahhhh. Non avevo capito il tuo intervento. Dato che i BigInteger in Java 
sono sempre intesi con segno l'extra bit serve per il segno. 
Naturalmente il bit è zero perché il numero è sempre zero, pero' c'e'.
Adesso ho capito, spero.


il 30/09/2008 9.31, Scrive Andrea Francia 43949016:

Spero che sia anche giusto, quagliare quaglia, ma e' solo una mia deduzione.
:-))
