My 2 cents: I wouldn't mind making all components that are non-deterministic in nature having their constructor explicitly pass a RNG instance (instead of using static magic).
That can be helpful when running several versions of the same algorithms with different hyper-parameters in separate threads of the same JVM on a multicore machine for instance. When you want to compare the impact of hyper parameters values (e.g. a learning rate schedule or a regularizer strength) you want to marginalize out the impact of random init of the regular parameters (the initial weights of the beta matrix in a logistic regression model). Same consideration holds for // cross-validation in a single JVM. If you think that having to pass RNG everywhere is too tedious I wouldn't mind using a light IoC framework such as Guice but setting up our own IoC such as the Bus feels like reinventing the wheel. Guice does not see to be much more complicated to work with than Bus would AFAIK and it's not invented here. -- Olivier http://twitter.com/ogrisel - http://code.oliviergrisel.name