Chuyển đến nội dung
Diễn đàn CADViet
anonmyous

Cần giúp về hàm random trong LISP

Các bài được khuyến nghị

Em muốn biết trong LISP có hàm Random số không, search trong Help hoài mà không thấy, nếu LISP không có hàm này thì có pác nào giúp em cái giải thuật RADOM với

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Em muốn biết trong LISP có hàm Random số không, search trong Help hoài mà không thấy, nếu LISP không có hàm này thì có pác nào giúp em cái giải thuật RADOM với

Tôi tìm được cái này trên mạng.

Bạn dùng hàm (rand 3 17) để tìm các số ngẫu nhiên từ 3 đến 17.

(defun rand (somin somax / r16 range quotient remainder result)
 (setq r16         (rand16))          
 (setq range       (+ 1 (- somax somin))) 
 (setq quotient    (/ r16 range))     
 (setq remainder   (- r16 (* quotient range))) 
 (setq result      (+ somin remainder))
 result
)
(defun rand16 ( / s )
 (if (null *SeedRand*) 
(progn
  (setq s (getvar "date"))
     (setq *SeedRand* (fix (* 86400 (- s (fix s))))) 
   ) 
 )   
 (setq *SeedRand* (+ (* *SeedRand* 1103515245) 12345)) 
 (logand (/ *SeedRand* 65536) 32767)
)
(setq *SeedRand* nil) ; initialize the global

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi tìm được cái này trên mạng.

Bạn dùng hàm (rand 3 17) để tìm các số ngẫu nhiên từ 3 đến 17.

(defun rand (somin somax / r16 range quotient remainder result)
 (setq r16         (rand16))          
 (setq range       (+ 1 (- somax somin))) 
 (setq quotient    (/ r16 range))     
 (setq remainder   (- r16 (* quotient range))) 
 (setq result      (+ somin remainder))
 result
)
(defun rand16 ( / s )
 (if (null *SeedRand*) 
(progn
  (setq s (getvar "date"))
     (setq *SeedRand* (fix (* 86400 (- s (fix s))))) 
   ) 
 )   
 (setq *SeedRand* (+ (* *SeedRand* 1103515245) 12345)) 
 (logand (/ *SeedRand* 65536) 32767)
)
(setq *SeedRand* nil) ; initialize the global

Về mặt lý thuyết không có hàm RANDOM trong Lisp (Tôi chưa tìm thấy tài liệu nào nhắc đến hàm này) Lệnh bác Hoành sưu tầm là một cách tính toán (với đủ phép cộng trừ nhân chia và các hằng số ) Thực chất của lệnh random trên là căn cứ vào thời điểm thực thi lệnh

(setq s (getvar "date"))

(setq *SeedRand* (fix (* 86400 (- s (fix s)))))

Như vậy mỗi người đều có thể tự viết cho mình một hàm random riêng với thuật toán riêng. Các kết quả chỉ mang tính "ngẫu nhiên" tương đối

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×