Es gibt eine lange Ganzzahl m = 38941629971148227236N. Ich möchte eine Zahl e zwischen 1 <e <m erzeugen und e prüfen, ob diese Anforderung erfüllt ist: gcd (e, m) = 1. Meine Methode ist es, (long (rand m)) zu verwenden, um zufällig e zu generieren. Ich habe eine Warnung erhalten:
IllegalArgumentException Value out of range for long:
1.7166121075068025E19 clojure.lang.RT.longCast (RT.java:1254)
Mein Code lautet:
(defn find-e [m]
(loop [e (long (rand m))]
(if (= 1 (gcd e m)) e
(recur (long (rand m))))))
Ich kenne das Ergebnis lange außerhalb des Bereichs, aber ich weiß nicht, ob es eine Möglichkeit gibt, dieses Problem zu lösen.
Das Problem liegt darin, (long (rand m))
dass der zufällige Wert, den Sie auswählen, oft viel größer ist, als in einen Long passen kann. Sie wollen nicht lange einen Bigint machen. Hier ist ein Weg, um es zu umgehen:
(bigint (bigdec (rand 38941629971148227236N)))
Beachten Sie, dass die Auswahl von Zufallszahlen auf diese Weise tatsächlich ein Double erzeugt, das in ein Bigdec konvertiert wird, das in ein Bigit konvertiert wird. Daher ist der Bereich möglicher Zufallswerte begrenzt. Wenn Sie ein Double als Basis-Zufallszahl verwenden, werden nicht alle möglichen Bigints generiert. Wenn Sie eine echte Bigint-Zufallsauswahl wünschen, werfen Sie einen Blick auf diese Antwort ... aber wenn Sie sich nicht allzu sehr darum kümmern, solange Sie einen Bigint im richtigen Bereich erhalten, könnte dies für Sie funktionieren:
(defn find-e [m]
(loop [e (bigint (bigdec (rand m)))]
(if (= 1 (gcd e m))
e
(recur (bigint (bigdec (rand m)))))))
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen