|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
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); } 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 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); } 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 Saluti. ![]() |
![]() |
![]() |
![]() |
#2 |
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 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. |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
Quote:
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(); } } Codice HTML:
7.26249 7.26249 7.26249 7.26249 7.26249 7.26249 7.26249 7.26249 7.26249 7.26249 ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
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. |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
Quote:
![]() 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. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
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? |
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
Quote:
![]() 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. ![]() |
|
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jul 2009
Messaggi: 81
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:10.