8
votes

Définir la graine sur math.random ()

J'ai besoin d'écrire des tests JUnit sur le code Java qui appelle math.random () . Je sais que je peux mettre la graine si j'instabilise mon propre objet aléatoire pour produire des résultats reproductibles. Y a-t-il un moyen de le faire aussi pour math.random () ?


0 commentaires

3 Réponses :


9
votes

Que diriez-vous de créer une instance de aléatoire vous-même et d'utiliser cela à la place? math.random () crée un et utilise cela, donc je ne pense pas que vous puissiez vous gâcher avec sa graine. Si vous créez un aléatoire et utilisez-le directement, vous pouvez définir la graine pour que vous le créez lorsque vous le créez et / ou vous pouvez appeler intermédiaire () dessus ultérieurement. .


0 commentaires

12
votes

la méthode math.random () utilise un champ statique privé: xxx

si vous vraiment vraiment besoin de définir ceci à un nouveau aléatoire (constante_seed) (par exemple, vous devez utiliser un code de test Junit que vous n'avez pas de contrôle) Vous pouvez le faire en utilisant réflexion .


2 commentaires

Pourriez-vous éventuellement élaborer sur la partie réflexion de votre réponse s'il vous plaît?


A partir de Java 8 (ou peut-être que c'était toujours comme ça), ceci est caché légèrement plus loin - il y a une finale statique privée aléatoireNumbergenerator toholder en mathémique qui contient ensuite une finale statique aléatoire .



3
votes

Réglez-le avec une instance de aléatoire avec votre graine ou d'étendre simplement les méthodes pour renvoyer les valeurs dont vous avez besoin

        Field field = Math.class.getDeclaredField("randomNumberGenerator");
        field.setAccessible(true);
        field.set(null, new Random() {

            @Override
            public double nextDouble() {
                return 1;
            }

        });


1 commentaires

La version canonique de Random devrait revenir 4!