Generieren Sie eine Array von Zahlen, die zu einer Wahrscheinlichkeitsverteilung in Ruby passen?
Frage
Sagen Sie, ich habe 100 Datensätze, und ich möchte das verspotten created_at
Datum, so dass es auf eine Kurve passt. Gibt es eine Bibliothek, um das zu tun, oder welche Formel könnte ich verwenden? Ich denke, das ist auf der gleichen Strecke:
Generieren Sie zufällige Zahlen mit probabilistischer Verteilung
Ich weiß nicht viel darüber, wie sie in Mathematik eingestuft werden, aber ich schaue mir Dinge an wie:
- Glockenkurve
- logarithmische (typische Biologie/Evolution) Kurve? ...
Suchen Sie nur nach einigen Formeln im Code, damit ich Folgendes sagen kann:
- Gegeben 100 Datensätze, eine Zeitspanne von
1.week
, und ein Intervall von12.hours
- einstellen
created_at
für jede Aufzeichnung so, dass es ungefähr zu passt, zucurve
Vielen Dank!
Aktualisieren
ich fand Dieser Forum -Beitrag über Ruby -Algorithmen, was mich dazu führte Rsruby, eine R/Ruby -Brücke, aber das scheint zu viel zu sein.
Update 2
Ich habe diesen kleinen Ausschnitt geschrieben, der das ausprobierte gsl
Bibliothek, dort ankommen ...
Lösung
Sie können Unix -Zeitstempel generieren, die wirklich nur Ganzzahlen sind. Finden Sie zuerst heraus, wann Sie jetzt anfangen möchten:
start = DateTime::now().to_time.to_i
Finden Sie heraus, wann das Ende Ihres Intervalls sein sollte (z. B. 1 Woche später):
finish = (DateTime::now()+1.week).to_time.to_i
Ruby verwendet Dieser Algorithmus zufällige Zahlen zu generieren. Es ist fast einheitlich. Generieren Sie dann zufällige Zahlen zwischen den beiden:
r = Random.new.rand(start..finish)
Wenden Sie das dann wieder in ein Datum um:
d = Time.at(r)
Das sieht auch vielversprechend aus:http://rb-gsl.rubyforge.org/files/rdoc/randist_rdoc.html
Und das auch:http://rb-gsl.rubyforge.org/files/rdoc/rng_rdoc.html
Andere Tipps
Ich bin kürzlich auf Croupier, ein Ruby -Juwel, das darauf abzielt, Zahlen gemäß einer Vielzahl statistischer Verteilungen zu generieren.
Ich habe es noch nicht ausprobiert, aber es klingt ziemlich vielversprechend.
Aus Wiki:
Es gibt einige Methoden, um eine Zufallszahl zu generieren, die auf einer Wahrscheinlichkeitsdichtefunktion basiert. Diese Methoden beinhalten die Transformation einer gleichmäßigen Zufallszahl in irgendeiner Weise. Aus diesem Grund eignen sich diese Methoden gleichermaßen gut bei der Generierung von Pseudo-Random- und echten Zufallszahlen.
Eine Methode, genannt die Inversionsmethode, beinhaltet die Integration in einen Bereich, der größer oder gleich der Zufallszahl ist (die zwischen 0 und 1 für ordnungsgemäße Verteilungen erzeugt werden sollte).
Eine zweite Methode, genannt die AkzeptanzverletzungsmethodeBeinhaltet die Auswahl eines X- und Y -Werts und die Prüfung der Funktion, ob die Funktion von x größer als der Y -Wert ist. Wenn ja, wird der X -Wert akzeptiert. Andernfalls wird der X -Wert abgelehnt und der Algorithmus versucht erneut.
Die erste Methode ist die, die in der akzeptierten Antwort in Ihrer so verlinkten Frage verwendet wird: Generieren Sie zufällige Zahlen mit probabilistischer Verteilung
Eine andere Option ist die Verteilung Edelstein unter Sciruby. Sie können Normalzahlen generieren durch:
require 'distribution'
rng = Distribution::Normal.rng
random_numbers = Array.new(100).map { rng.call }
Es gibt auch RNGs für verschiedene andere Verteilungen.