Generare array di numeri che si adattano ad una distribuzione di probabilità in Ruby?
Domanda
Dire che ho 100 record, e voglio prendere in giro fuori la data created_at
modo che si adatta su qualche curva. C'è una libreria per fare questo, o quello che la formula ho potuto usare? Penso che questo sia lungo la stessa traccia:
generare numeri casuali con distribuzione probabilistica
Non so molto su come sono classificati in matematica, ma sto guardando le cose come:
- curva a campana
- logaritmica (tipico biologia / evolution) della curva? ...
Solo in cerca di alcune formule in codice in modo che posso dire questo:
- Dato 100 record, un periodo di
1.week
, e un intervallo di12.hours
- Set
created_at
per ogni record in modo tale che si adatta, grosso modo, acurve
Grazie mille!
Aggiorna
questo post del forum A proposito di Ruby algoritmi , che mi ha portato a rsruby , un R / ponte rubino, ma che sembra troppo.
Aggiorna 2
Ho scritto questo piccolo frammento provare la biblioteca gsl
, arrivando ...
generare dati di test in Rails dove created_at cadute lungo una distribuzione statistica
Soluzione
È possibile generare timestamp UNIX, che sono in realtà solo numeri interi. In primo luogo capire quando si desidera avviare, per esempio ora:
start = DateTime::now().to_time.to_i
Scopri quando la fine del l'intervallo dovrebbe essere (dire dopo 1 settimana):
finish = (DateTime::now()+1.week).to_time.to_i
questo algoritmo per generare numeri casuali. E 'quasi uniforme. Poi generare numeri casuali tra i due:
r = Random.new.rand(start..finish)
Poi convertire che torna a una data:
d = Time.at(r)
Questo sembra essere molto promettente, nonché: http://rb-gsl.rubyforge.org/files/rdoc/randist_rdoc.html
E anche questo: http://rb-gsl.rubyforge.org/files/rdoc/rng_rdoc.html
Altri suggerimenti
Recentemente ho imbattuto croupier , una gemma rubino che mira a generare numeri a seconda di una serie di statistiche distribuzioni.
devo ancora provarlo ma suona molto promettente.
wiki :
Ci sono un paio di metodi per generare un numero casuale sulla base di un densità di probabilità. Questi metodi prevedono la trasformazione di un uniforme numero casuale in qualche modo. Per colpa di questo, questi metodi funzionano ugualmente bene nel generare sia pseudo-casuali e veri numeri casuali.
Un metodo, chiamato inversione Metodo , comporta integrare fino a una maggiore area o uguale al numero casuale (che dovrebbe essere generato tra 0 e 1 per la corretta distribuzioni).
Un secondo metodo, chiamato metodo di accettazione-rifiuto , comporta la scelta di un valore X e Y e verificando se la funzione di x è maggiore del valore y. Se è, il valore x viene accettato. Altrimenti, il valore x viene respinta e il algoritmo ci riprova.
Il primo metodo è quello usato nella risposta accettata nella sua domanda SO collegato: generare numeri casuali con distribuzione probabilistica
Un'altra opzione è la Distribuzione gioiello in SciRuby . È possibile generare numeri normali da:
require 'distribution'
rng = Distribution::Normal.rng
random_numbers = Array.new(100).map { rng.call }
Ci sono RNG per varie altre distribuzioni.