Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-06-2010, 00:06   #1
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
[JAVA] Numeri veramente random

Ragazzi per un progetto devo fare un generatore di istanze per un problema di ottimizzazione, che deve essere realizzato in java. Grosso modo è pronto... Ma se lavora così mi conviene generare queste istanze con la fantasia piuttosto che con questo generatore...

Praticamente mi genera un universo U di n items ed m sottinsiemi disgiunti che devono coprire tutti gli n oggetti. Ovviamente, essendo disgiunti, il numero di sottinsiemi è m t.c. 0 < m <= n

Tanto per fare un esempio mi genera un universo di 2300 items e 1900 sottinsiemi. Ora viene il bello, anzi il brutto....

Prendo il primo sottinsieme e genero randomicamente la cardinalità: 170... bene, andiamo avanti, secondo sottinsieme: cardinalità 1. terzo: 1, poi 1, 1 e così via e ogni tanto ne genera qualcuno più grosso (altrimenti non coprirebbe tutti gli oggetti)....

Ragazzi posso anche capire che mi generi un'istanza fatta in questo modo.... Ma non è possibile che in diverse decine di esecuzioni mi generi le cardinalità dei sottinsiemi tutte fatte in questo modo...

Potete cortesemente darmi una mano a capire dove sbaglio?

Grazie!

Ultima modifica di VegetaSSJ5 : 21-06-2010 alle 00:09.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 10:14   #2
pernacentus
Member
 
L'Avatar di pernacentus
 
Iscritto dal: Apr 2009
Messaggi: 218
Come inizializzi l'oggetto random? Se utilizzi il costruttore new Random(long seed) mettendo sempre lo stesso seed è ovvio che ad ogni esecuzione le istanze dei sottoinsiemi abbiano sempre le stesse cardinalità. Poi se vuoi una distribuzione più casuale possibile non utilizzare Random, ma SecureRandom.
pernacentus è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 11:55   #3
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da pernacentus Guarda i messaggi
Come inizializzi l'oggetto random? Se utilizzi il costruttore new Random(long seed) mettendo sempre lo stesso seed è ovvio che ad ogni esecuzione le istanze dei sottoinsiemi abbiano sempre le stesse cardinalità. Poi se vuoi una distribuzione più casuale possibile non utilizzare Random, ma SecureRandom.
ah.....
quindi Random va inizializzato con un parametro long?
chiedo scusa ma in effetti non ho molta esperienza con il java. Semplicemente mi creo l'oggetto

Random oRandGenoRandGen = new Random();

e da lì comincio con la generazione di numeri casuali (che ripeto sono dell'ordine delle migliaia) in questo modo


oRandGen.nextInt(iNumMax);
ecc...

Come mi consigli di correggere?
Inoltre cos'è SecureRandom?
Grazie....
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 12:55   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
Quote:
Originariamente inviato da VegetaSSJ5 Guarda i messaggi
Ragazzi per un progetto devo fare un generatore di istanze per un problema di ottimizzazione, che deve essere realizzato in java. Grosso modo è pronto... Ma se lavora così mi conviene generare queste istanze con la fantasia piuttosto che con questo generatore...

Praticamente mi genera un universo U di n items ed m sottinsiemi disgiunti che devono coprire tutti gli n oggetti. Ovviamente, essendo disgiunti, il numero di sottinsiemi è m t.c. 0 < m <= n

Tanto per fare un esempio mi genera un universo di 2300 items e 1900 sottinsiemi. Ora viene il bello, anzi il brutto....

Prendo il primo sottinsieme e genero randomicamente la cardinalità: 170... bene, andiamo avanti, secondo sottinsieme: cardinalità 1. terzo: 1, poi 1, 1 e così via e ogni tanto ne genera qualcuno più grosso (altrimenti non coprirebbe tutti gli oggetti)....

Ragazzi posso anche capire che mi generi un'istanza fatta in questo modo.... Ma non è possibile che in diverse decine di esecuzioni mi generi le cardinalità dei sottinsiemi tutte fatte in questo modo...

Potete cortesemente darmi una mano a capire dove sbaglio?

Grazie!
Stavo pensando che comunque è inevitabile con 1900 sottoinsiemi ed un universo di 2300 oggetti avere almeno 1500 sottoinsiemi da un elemento solo.
Una cosa che potresti fare è mettere in tutti i 1900 sottoinsiemi un solo elemento e poi mettere i 400 rimanenti qua e là a caso. In questo modo però molto difficilmente andrai oltre i 5 elementi nello stesso sottoinsieme (ho sparato una cifra a caso).
Comunque il costruttore di Random senza parametri inizializza da solo il seed in modo che molto difficilmente tra un'esecuzione e l'altra la sequenza di numeri generati si ripeta.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 13:08   #5
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Stavo pensando che comunque è inevitabile con 1900 sottoinsiemi ed un universo di 2300 oggetti avere almeno 1500 sottoinsiemi da un elemento solo.
Una cosa che potresti fare è mettere in tutti i 1900 sottoinsiemi un solo elemento e poi mettere i 400 rimanenti qua e là a caso. In questo modo però molto difficilmente andrai oltre i 5 elementi nello stesso sottoinsieme (ho sparato una cifra a caso).
Comunque il costruttore di Random senza parametri inizializza da solo il seed in modo che molto difficilmente tra un'esecuzione e l'altra la sequenza di numeri generati si ripeta.
ciò che dici è vero....
però mi succede anche che mi genera un universo di 2000 oggetti e 20 sottoinsiemi di cui i primi contengono parecchi elementi (300/400) e gli altri un solo elemento.... vorrei evitare questa sfilza di 1....
so che dopo un certo numero di insiemi grandi, inevitabilmente si scende con la cardinalità, però non vorrei che succeda dopo 2/3 insiemi....

quindi per l'inizializzazione del Random va bene come ho fatto io suppongo...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 13:27   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
Quote:
Originariamente inviato da VegetaSSJ5 Guarda i messaggi
ciò che dici è vero....
però mi succede anche che mi genera un universo di 2000 oggetti e 20 sottoinsiemi di cui i primi contengono parecchi elementi (300/400) e gli altri un solo elemento.... vorrei evitare questa sfilza di 1....
so che dopo un certo numero di insiemi grandi, inevitabilmente si scende con la cardinalità, però non vorrei che succeda dopo 2/3 insiemi....

quindi per l'inizializzazione del Random va bene come ho fatto io suppongo...
Potresti provare lo stesso approccio che dicevo nello scorso post, sperando che non vengano delle cardinalità troppo uniformamente distribuite (20 sottoinsiemi da 100 elementi ciascuno).
Io proverei, se poi mi viene qualche altra idea ti faccio sapere.

EDIT: sì il Random va bene. Comunque se vuoi dare un'occhiata anche a SecureRandom, vedi qua: LINK

Ultima modifica di wingman87 : 21-06-2010 alle 13:29.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 14:43   #7
pernacentus
Member
 
L'Avatar di pernacentus
 
Iscritto dal: Apr 2009
Messaggi: 218
Se tu provassi con:
Codice:
int[] sottoinsiemi = new int[numSottoinsiemi];
for(int i=0;i<numSottoinsiemi;i++){
			sottoinsiemi[i] = r.nextInt(noggetti) + 1;
}
Solo che non ho capito se la somma delle cardinalità dei sottoinsiemi deve essere uguale al numero di oggetti, oppure se il problema di ottimizzazione è proprio il Partition Problem e devi stabilire se gli oggetti possono essere contenuti in un insieme composto dai vari sottoinsiemi disgiunti.
pernacentus è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 17:07   #8
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da pernacentus Guarda i messaggi
Se tu provassi con:
Codice:
int[] sottoinsiemi = new int[numSottoinsiemi];
for(int i=0;i<numSottoinsiemi;i++){
			sottoinsiemi[i] = r.nextInt(noggetti) + 1;
}
Solo che non ho capito se la somma delle cardinalità dei sottoinsiemi deve essere uguale al numero di oggetti, oppure se il problema di ottimizzazione è proprio il Partition Problem e devi stabilire se gli oggetti possono essere contenuti in un insieme composto dai vari sottoinsiemi disgiunti.
la somma delle cardinalità dei sottoinsiemi deve essere pari al numero totale di oggetti. si tratta del multiple choice knapsack. allego il pezzo di codice che genera i sottoinsiemi e vi associa gli oggetti (per comodità ho eliminato le istruzioni che scrivono su file):
Codice:
for (i = 1; i <= iNumSubsets; i++) {
	// DETERMINA LA MASSIMA CARDINALITA' DEL SOTTOINSIEME CHE E' PARI AL
	// NUMERO DI OGGETTO RIMANENTI MENO IL NUMERO DI SOTTOINSIEMI DA INSERIRE
	// SE STO INSERENDO L'ULTIMO SOTTOINSIEME VI INSERISCO TUTTI GLI OGGETTI RIMANENTI
	if (i < iNumSubsets) iCardSubset = 1 + oRandGen.nextInt(oItemList.size() - (iNumSubsets - i));
	else iCardSubset = oItemList.size();

	// GENERO I NUMERI DA INSERIRE NEL SOTTINSIEME
	for (j = 1; j <= iCardSubset; j++) {
		// PRENDO L'INDICE DI UN ELEMENTO A CASO E SCRIVO NEL FILE L'ELEMENTO CORRISPONDENTE A QUELL'INDICE
		iItemIndex = oRandGen.nextInt(oItemList.size());
		// RIMUOVO L'ELEMENTO DALLA LISTA
		oItemList.remove(iItemIndex);
	}
}

Ultima modifica di VegetaSSJ5 : 21-06-2010 alle 17:10.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 18:46   #9
pernacentus
Member
 
L'Avatar di pernacentus
 
Iscritto dal: Apr 2009
Messaggi: 218
Quote:
Originariamente inviato da VegetaSSJ5 Guarda i messaggi
la somma delle cardinalità dei sottoinsiemi deve essere pari al numero totale di oggetti. si tratta del multiple choice knapsack. allego il pezzo di codice che genera i sottoinsiemi e vi associa gli oggetti (per comodità ho eliminato le istruzioni che scrivono su file):
Codice:
for (i = 1; i <= iNumSubsets; i++) {
	// DETERMINA LA MASSIMA CARDINALITA' DEL SOTTOINSIEME CHE E' PARI AL
	// NUMERO DI OGGETTO RIMANENTI MENO IL NUMERO DI SOTTOINSIEMI DA INSERIRE
	// SE STO INSERENDO L'ULTIMO SOTTOINSIEME VI INSERISCO TUTTI GLI OGGETTI RIMANENTI
	if (i < iNumSubsets) iCardSubset = 1 + oRandGen.nextInt(oItemList.size() - (iNumSubsets - i));
	else iCardSubset = oItemList.size();

	// GENERO I NUMERI DA INSERIRE NEL SOTTINSIEME
	for (j = 1; j <= iCardSubset; j++) {
		// PRENDO L'INDICE DI UN ELEMENTO A CASO E SCRIVO NEL FILE L'ELEMENTO CORRISPONDENTE A QUELL'INDICE
		iItemIndex = oRandGen.nextInt(oItemList.size());
		// RIMUOVO L'ELEMENTO DALLA LISTA
		oItemList.remove(iItemIndex);
	}
}
Ok, ho a fuoco il problema. Il modo in cui procedi nella creazione dei sottoinsiemi e dell'assegnazione degli oggetti è corretto. Il problema, secondo me, sta nel fatto che il random ti genera numeri alti nei primi cicli, così da dover inserire pochi oggetti nei sottoinsiemi rimanenti. Mi sa tanto che non puoi farci molto purtroppo.
pernacentus è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 18:48   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
Questo sarebbe quello che intendevo:
Codice:
/*
items: tutti gli oggetti (è una lista)
subsets: è un array di liste e ogni lista rappresenta un sottoinsieme
*/

//Disordina gli oggetti
Collections.shuffle(items);

//Metto un elemento in ogni sottoinsieme
for (i = 0; i < subsets.length; i++) {
   subsets[i].add(items.remove(0));
}

Random rand=new Random();
//Metto gli elementi rimanenti dentro a dei sottoinsiemi casuali
while(!items.isEmpty()){
   int index=rand.nextInt(subsets.length);
   subsets[index].add(items.remove(0));
}
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 19:14   #11
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da pernacentus Guarda i messaggi
Ok, ho a fuoco il problema. Il modo in cui procedi nella creazione dei sottoinsiemi e dell'assegnazione degli oggetti è corretto. Il problema, secondo me, sta nel fatto che il random ti genera numeri alti nei primi cicli, così da dover inserire pochi oggetti nei sottoinsiemi rimanenti. Mi sa tanto che non puoi farci molto purtroppo.
in effetti anch'io sono arrivato a questa conclusione... stavo pensando di cambiare la creazione delle cardinalità dei sottoinsiemi partendo da un numero medio e facendo un + o - 50% ad esempio...
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Questo sarebbe quello che intendevo:
Codice:
/*
items: tutti gli oggetti (è una lista)
subsets: è un array di liste e ogni lista rappresenta un sottoinsieme
*/

//Disordina gli oggetti
Collections.shuffle(items);

//Metto un elemento in ogni sottoinsieme
for (i = 0; i < subsets.length; i++) {
   subsets[i].add(items.remove(0));
}

Random rand=new Random();
//Metto gli elementi rimanenti dentro a dei sottoinsiemi casuali
while(!items.isEmpty()){
   int index=rand.nextInt(subsets.length);
   subsets[index].add(items.remove(0));
}
questa mi sembra un'ottima idea.
appena la implemento di faccio sapere...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 20:07   #12
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
wingman ho implementato la soluzione che hai suggerito e devo dire che funziona molto bene. ora la cardinalità dei sottoinsiemi è molto più uniforme....
posto qui il pezzo di codice
Codice:
// CREAZIONE LISTA DI SUPPORTO CONTENENTE GLI OGGETTI
ArrayList<Integer> oItemList = new ArrayList<Integer>();
for (i = 1; i <= iInstNumItems; i++) oItemList.add(new Integer(i));

// DISORDINA GLI ELEMENTI
Collections.shuffle(oItemList);

ArrayList[] oSubsetList = new ArrayList[iInstNumSubsets];
for (i = 0; i < iInstNumSubsets; i++) oSubsetList[i] = (new ArrayList());

// METTO UN ELEMENTO IN OGNI SOTTOINSIEME
for (i = 0; i < oSubsetList.length; i++) oSubsetList[i].add(oItemList.remove(0));

// METTO GLI ELEMENTI RIMANENTI DENTRO SOTTOINSIEMI CASUALI
while(!oItemList.isEmpty()) {
	i = oRandGen.nextInt(oSubsetList.length);
	oSubsetList[i].add(oItemList.remove(0));
}

// SCRIVO I SOTTOINSIEMI NEL FILE
oFileWriter.write("set CLASSES[<i> in SUBSET] := ");
for (i = 0; i < oSubsetList.length; i++) {
	if (i != 0) oFileWriter.write(",");
	oFileWriter.write("<" + (i+1) + ">");
	while(!oSubsetList[i].isEmpty()) {
		oFileWriter.write(oSubsetList[i].remove(0).toString());
		if (oSubsetList[i].size() > 0) oFileWriter.write(",");
	}
	if ((i+1) == oSubsetList.length) oFileWriter.write(";");
}
ora c'è solo un piccolo problemino logistico: quando compilo mi dà dei warning:
Codice:
C:\Users\Armando\Documents\NetBeansProjects\TEST\src\test\Main.java:96: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
            for (i = 0; i < oSubsetList.length; i++) oSubsetList[i].add(oItemList.remove(0));
                                                                       ^
C:\Users\Armando\Documents\NetBeansProjects\TEST\src\test\Main.java:101: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
                oSubsetList[i].add(oItemList.remove(0));
                                  ^
2 warnings
ho eliminato il warning anche nella riga seguente specificando i tipi degli oggetti.

ArrayList<Integer> oItemList = new ArrayList<Integer>();

come posso evitare questi warning anche negli array? grazie!
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 21:01   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
Puoi eliminarli usando:
ArrayList<Integer>[] oSubsetList =new ArrayList[iInstNumSubsets];
invece di:
ArrayList[] oSubsetList =new ArrayList[iInstNumSubsets];

Però in questo modo avrai un warning proprio su questa riga. Purtroppo non credo che si possa eliminare questo warning in modo pulito.

Puoi fare in modo che non ti venga più notificato aggiungendo
@SuppressWarning("unchecked")
Sopra alla firma del metodo.

Un'altro modo è usare un ArrayList invece di un array nativo, però in questo modo, secondo me, il codice perde in leggibilità.

Al momento non mi viene in mente altro.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 22:06   #14
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
ho usato il suppress warning...
ti ringrazio!
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Stranger Things non è finito! Ecc...
iPhone 18, il mistero sul destino della ...
Motorola lavora al nuovo Razr 70 Ultra: ...
Il programma di ridimensionamento di One...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:52.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v