Có số nguyên dài m = 38941629971148227236N. Tôi muốn tạo một số điện tử giữa 1 < e < m và kiểm tra e nếu đáp ứng yêu cầu này: gcd (e, m) = 1. Phương pháp của tôi là sử dụng (dài (rand m)) để tạo ra điện tử một cách ngẫu nhiên, tôi nhận được một cảnh báo:Cách tạo số ngẫu nhiên dài trong clojure
IllegalArgumentException Value out of range for long:
1.7166121075068025E19 clojure.lang.RT.longCast (RT.java:1254)
Mã của tôi là:
(defn find-e [m]
(loop [e (long (rand m))]
(if (= 1 (gcd e m)) e
(recur (long (rand m))))))
tôi biết kết quả ra khỏi phạm vi trong thời gian dài, nhưng tôi không biết là có cách nào để giải quyết vấn đề này?
Câu trả lời thực sự hay. Đối với 'giới hạn' lớn, số lần thử lại không phải là vấn đề. – muhuk
Thực ra tôi đã sai, nó có thể là một vấn đề khi mọi thứ tăng gấp đôi không gian tìm kiếm. Và 'giới hạn' lớn hơn sẽ trở nên tồi tệ hơn. – muhuk