Wenn Sie für die Instanziierung eines java.util.Random-Objekts verantwortlich sind, können Sie java.util.Random unterklassifizieren und stattdessen Ihre eigene Klasse instanziieren. Wenn ein anderer Code, den Sie nicht ändern können, für die Instanziierung verantwortlich ist, können Sie natürlich nicht Ihre eigene Unterklasse verwenden. Ich nehme an, dass dies in Ihrem Fall keine Option ist.
Eine weitere Alternative besteht darin, die Implementierung zum Zeitpunkt des Ladens der Klasse zu ändern. Im Grunde schreiben Sie den Bytecode von java.util.Random so um, dass er etwas anderes tut als das, was er standardmäßig tut. Der Nachteil dabei ist, dass sich dies auf alle Instanzen von java.util.Random auswirkt, nicht nur auf die eine Instanz, die Sie vielleicht ändern möchten. Andererseits ist der meiste Code nicht auf die Implementierungsdetails des RNG angewiesen, so dass dies wahrscheinlich kein Problem darstellt.
Javassist ist eine sehr schöne Bytecode-Bibliothek. Sie ermöglicht es Ihnen, Bytecode beim Laden der Klasse umzuschreiben, so dass Sie z. B. den Körper der Methode, die die Zufallszahl erzeugt, durch einen Aufruf Ihrer eigenen Klasse ersetzen können, die den benötigten RNG-Algorithmus implementiert.
Sie könnten einen einfachen Klassendateiprozessor schreiben, der für die Klasse java.util.Random ausgeführt wird. Der Code könnte etwa so aussehen:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Random"); // maybe java.util.Random
CtMethod m = cc.getDeclaredMethod("nextLong");
m.setBody("my.super.duper.RandomClass.nextLong()");
cc.writeFile();