Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-01-2018, 14:54   #1
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
[C++] Generazione Numeri Casuali

Buongiorno,
poiché sto sviluppando una neural network tramite C++ necessito di una funzione che restituisca ogni volta chiamata un DIVERSO numero causale compreso tra due input ("a" e "b") e dotato di distribuzione uniforme. Siccome siamo nel 2018 mi rifiuto di usare rand() .

Ho provato a scrivere la funzione in due diverse forme, ma in entrambi i casi, in maniera diversa, quando chiamata mi restituisce sempre gli stessi numeri. Elenco di seguito il codice e il relativo cout. Che sia un problema di seed che viene "aggiornato" troppo lentamente? Avete soluzioni migliori?

FUNZIONE 1
Codice:
float runif(float a, float b){
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::default_random_engine generator (seed);
    std::uniform_real_distribution<double> distribution (a, b);
    return distribution(generator);
}
OUTPUT 1
Codice HTML:
0.549771
0.627088
0.627088
0.627088
0.627088
0.875693
0.875693
0.875693
0.875693
0.875693
0.875693
0.511808
0.511808
FUNZIONE 2
Codice:
float runif(float a, float b){
std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_real_distribution<float> dis(a, b);
    return dis(gen);
}
OUTPUT 2
Codice HTML:
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
0.561703
Concludo che questa funzione non può essere incorporata nel codice principale poiché viene richiamata anche in diverse altre funzioni all'interno del programma.
Saluti.
skeleton è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 15:54   #2
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Per prima cosa vorrei fare un pò l'impiccione e ti chiedo perchè non usi Tensorflow? E' fatta apposta per implementare reti neurali, è usabile in C++ e ovviamente supporta classi per generare numeri casuali in tutti i modi possibili https://www.tensorflow.org/api_guides/cc/guide

Detto questo, se usi C++1

Codice:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double>  distr(0.0, 10.0);

distr(gen) per estrarre il numero casuale
Sul mio computer genera numeri diversi e uniformemente distribuiti. Con float al posto del double però, la distribuzione peggiora vistosamente ( anche se non ho visto una situazione disastrosa come quella dell'output 2 ).


Senza C++1, la più ovvia soluzione è rivolgersi a Boost http://www.boost.org/doc/libs/1_55_0...st_random.html

Ultima modifica di pabloski : 28-01-2018 alle 15:57.
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 16:18   #3
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
Quote:
Originariamente inviato da pabloski Guarda i messaggi
Per prima cosa vorrei fare un pò l'impiccione e ti chiedo perchè non usi Tensorflow? E' fatta apposta per implementare reti neurali, è usabile in C++ e ovviamente supporta classi per generare numeri casuali in tutti i modi possibili https://www.tensorflow.org/api_guides/cc/guide

Detto questo, se usi C++1

Codice:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double>  distr(0.0, 10.0);

distr(gen) per estrarre il numero casuale
Sul mio computer genera numeri diversi e uniformemente distribuiti. Con float al posto del double però, la distribuzione peggiora vistosamente ( anche se non ho visto una situazione disastrosa come quella dell'output 2 ).


Senza C++1, la più ovvia soluzione è rivolgersi a Boost http://www.boost.org/doc/libs/1_55_0...st_random.html

Non uso TensorFlow perché voglio costruire una semplice rete neurale interamente con le mie mani. A mio modo di vedere è così che si capisce la reale complessità di quest'argomento. Detto ciò, quanto da te postato è esattamente la mia FUNZIONE 2, la peggiore in termini di risultati.

Ho provato a scrivere un veloce programmino per vedere se il problema derivasse dal resto del codice non postato e non dalla funzione da te riportata. Risposa negativa. Posto la prova e relativo risultato.

Codice:
#include <iostream>
#include <random>
using namespace std;

double runif(){
	std::random_device rd;
	std::mt19937 gen(rd());
	std::uniform_real_distribution<double>  distr(0.0, 10.0);
    return distr(gen);
}

int main(){
	for(int i=0; i<10; i++){
		cout<<endl<<runif();
	}
}
OUTPUT
Codice HTML:
7.26249
7.26249
7.26249
7.26249
7.26249
7.26249
7.26249
7.26249
7.26249
7.26249
Il programma restituisce lo stesso risultato sia ad ogni cout che ad ogni suo avvio. La sua risposta è sempre "7.26249".
skeleton è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 18:32   #4
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
ma se devi studiare le reti neurali, non capisco perchè fossilizzarsi su un gneratore di numeri casuali:non è affatto banale crearne uno non predicibile.
Io prenderi dei testi su internet e tratterei le lettere come numeri casuali; piu casuali di così. Attraverso tali testi inizierei ad istruire la mia rete ed ottenere così ciò che mi interessa studiare.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 19:01   #5
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
Quote:
Originariamente inviato da misterx Guarda i messaggi
ma se devi studiare le reti neurali, non capisco perchè fossilizzarsi su un gneratore di numeri casuali:non è affatto banale crearne uno non predicibile.
Io prenderi dei testi su internet e tratterei le lettere come numeri casuali; piu casuali di così. Attraverso tali testi inizierei ad istruire la mia rete ed ottenere così ciò che mi interessa studiare.
Perdonami ma non è più complicato prendere dei testi da internet, trasformare le lettere in numeri, addestrare una rete neurale, ecc che creare una semplice funzione generatrice di numeri casuali?
I numeri casuali mi servono per definire il valore iniziale dei pesi delle connessioni e soprattutto far prendere decisioni alla rete in merito ad esempio alle mutazioni. Inoltre usando un testo come base per ottenere numeri casuali ad ogni avvio avrei sempre gli valori. Trasformando così la rete neurale in una rete deterministica. Ad ogni avvio farebbe le stesse operazioni.
skeleton è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 19:37   #6
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
ok, pensavo fossi concentrato sullo studio delle reti. E' un argomento che continuo ad iniziare e a piantare e non vado avanti. Comunque ricordo che non era banale implementarne uno, nemmeno legandosi al clock di sistema. I testi posseggono una buona casualità, per questo te li avevo suggeriti, basta un copia ed incolla di un qualsiasi file di testo se non si vuole implementare una qualche socket.

Se posso: cosa stai studiando?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 20:09   #7
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
Quote:
Originariamente inviato da misterx Guarda i messaggi
ok, pensavo fossi concentrato sullo studio delle reti. E' un argomento che continuo ad iniziare e a piantare e non vado avanti. Comunque ricordo che non era banale implementarne uno, nemmeno legandosi al clock di sistema. I testi posseggono una buona casualità, per questo te li avevo suggeriti, basta un copia ed incolla di un qualsiasi file di testo se non si vuole implementare una qualche socket.

Se posso: cosa stai studiando?
Può essere che piazzando un timer tra una chiamata di funzione e l'altra si ottengano numeri più "pseudo-causali"?

Il progetto che ho intrapreso è del tutto personale. Sto studiando gli algoritmi genetici, in particolare quelli che sono in grado di autocostruirsi una topologia sufficiente e adatta a risolvere un dato problema.
skeleton è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 20:52   #8
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
e' normale che restituisca sempre lo stesso valore se ogni volta re-inizializzi il seed...
Ok capito, quindi il seed non va all'interno della funzione..corretto?

Come faccio però a definire di volta in volta gli estremi della mia distribuzione? Vorrei che fossero un parametro a me libero, cioè sceglibile durante il resto del codice.

Ultima modifica di skeleton : 28-01-2018 alle 20:56.
skeleton è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2018, 21:43   #9
skeleton
Member
 
L'Avatar di skeleton
 
Iscritto dal: Jul 2009
Messaggi: 81
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
il seed e' il valore che inizializza il generatore di numeri random. Stesso seed, stessa sequenza di numeri casuali. Una volta inizializzato il generatore (una volta sola nel programma) devi solo estrarre i numeri. Se reinizializzi ogni volta il generatore, e' come se partissi di nuovo daccapo (e std::random_device, puo' ritornare sempre la stessa sequenza di numeri, e.g. puo' ritornare sempre lo stesso valore per inizializzare il generatore).


inizializzi il tuo generatore nell'intervallo [0,1] e cominci a estrarre. quando vuoi spostare il range su [alfa, k*1+alfa], moltiplica il numero ottenuto per k e somma alfa.

e.s. vuoi un numero in [10,15], il tuo k ed il tuo alfa saranno rispettivamente k=5 e alfa=10.
Ti ringrazio tanto. Problema decisamente risolto
skeleton è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
In arrivo la 'pagella' per i datacenter:...
Celle perovskite-silicio al 34% grazie a...
Apple prepara il suo nuovo hub intellige...
La Cadillac Lyriq-V elettrica sbarca in ...
Amazon: arriva l'opzione per aggiungere ...
Un developer usa Claude Code per creare ...
Relativity Space annuncia i progressi ne...
Il nuovo Resident Evil supera ogni prece...
Hai appena sconfitto un boss e parte lo ...
Ray tracing anche senza montagne di VRAM...
TSMC prepara il processo a 1,4 nm: quatt...
Diablo V arriverà nel 2029: Blizzard spi...
Il nuovo CTO di Disney arriva da Charact...
GDPR, Google multata per 403 milioni di ...
Quattro token al secondo senza GPU: GLM ...
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: 15:50.


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