Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-06-2010, 01: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 01:09.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 11: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, 12: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, 13:55   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
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, 14: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, 14:27   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
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 14:29.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 15: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, 18: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 18:10.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 19: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, 19:48   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
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, 20: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, 21: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, 22:01   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
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, 23: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


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Reddit punterà sull'AI per miglio...
Samsung ha obiettivi molto ambiziosi per...
I produttori non faranno sconti sulle me...
Ubisoft potrebbe cedere pezzi se il pian...
Qualcomm potrebbe utilizzare una tecnolo...
Starfield per Nintendo Switch 2 potrebbe...
Un MacBook Pro a -300€, i MacBook Air M4...
Amazon abbassa i prezzi sugli iPhone: sc...
Amazon, ancora sconti sugli smartphone A...
iPhone Air 2 'riciclerà' alcuni c...
Offerta Amazon da non perdere: lo speake...
Nioh 3 debutta alla grande su Steam: pri...
Al centro della Via Lattea ci potrebbe e...
Elon Musk ora guarda alla Luna: SpaceX p...
La Cina ha lanciato nuovamente lo spazio...
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: 06:52.


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