Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
3 replies to this topic

#1 anonmyous

anonmyous

    biết vẽ arc

  • Members
  • PipPip
  • 48 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 10 July 2008 - 03:23 PM

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
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 10 July 2008 - 03:34 PM

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

  • 0

#3 anonmyous

anonmyous

    biết vẽ arc

  • Members
  • PipPip
  • 48 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 10 July 2008 - 03:52 PM

Cảm ơn bạn nhiều nha, không ngờ reply nhanh vậy, thanks a lot!!!
  • 0

#4 Snowman

Snowman

    biết lệnh mirror

  • Members
  • PipPipPip
  • 155 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 10 July 2008 - 06:22 PM

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
  • 0

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi