Я использую org.apache.commons.math3.distribution.NormalDistribution
в большом распространенном приложении Scala & Akka. Во время отладки я нашел sample()
время от времени возвращались NaN, который распространяющаяся молча и вызвал нить, чтобы повесить в org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator
Предупреждения о безопасности нитей
Наны могут быть воспроизведены только с параллельным colelctions (не происходит в последовательном коде):
val normal = new NormalDistribution(0,0.1)
(1 to 1000000000).par.foreach{i =>
val r = normal.sample
if(r.isNaN()) throw new Exception("r = "+r)
}
Очевидно, что перемещение val normal
внутри foreach
решает проблему в этом случае.
Я просмотрел docs, но не вижу ничего предупреждающего меня о таких проблемах. Неужели я не понял более фундаментальную концепцию безопасности потоков? Излишне говорить, что я сейчас проверяю NaN.
Обратите внимание, что старый добрый 'java.util.Random' является и поточным, и незамкнутым ... –
@MichaelBorgwardt Правда, и хороший улов! Кто-то, кто знает apache.commons.math, может направить человека, задающего вопрос о том, как вложить его в случайные распределения, если это возможно. Я действительно ничего не знаю об этой библиотеке, поэтому я не могу помочь там ... –