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

[Yêu cầu] Lisp tạo một số ngẫu nhiên trong khoảng nhập vào

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

Chào các bác.

Trong Excel (2007-2010...) có 1 hàm rất hay là hàm randombetween cho phép chúng ta nhập khoảng trên khoảng dưới thì sẽ tạo ra một số ngẫu nhiên nằm trong khoảng đó.

Ví dụ: randombetween (0,9) = KQ

Kết quả này có thể chạy từ 0 đến 9 một cách ngẫu nhiên.

Không biết liệu LISP có thể tạo ra được hàm như vậy được không các bác

Nếu có thì rất mong được sự chia sẻ của các bác.

 

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

Random bằng lisp thì cụ gồ có nhiều lắm. Chẳng hạn em có thể biến tấu ở link này:

http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Generate-a-list-of-n-random-numbers-who-sum-is-1-or-100/m-p/3021534/highlight/true#M296571

  • Vote tăng 1

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

Bạn cũng có thể dùng cái này, tôi không nhớ lấy ý tưởng từ đâu nữa nhưng thấy ngắn gọn.

Cái này cũng có nhược điểm là nếu a là số thực thì nó trả về số thực với phần lẻ giống phần lẻ của a.

Bạn cũng có thể bỏ cái fix đi nếu tính với số thực, còn số nguyên thì để nguyên.

 

(defun rand(a b)
    (+ a (fix (* (- b a) (atof (strcat "0." (substr (rtos (getvar 'cdate) 2 18) 16 2))))))
  )
  • Vote tăng 2

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 cảm ơn bác Hạ và anh Tot77.

LISP anh Tot77 thật tuyệt ạ.

Em đang cần 1 số ý tưởng nên cần 1 số modul nhỏ.

Chúc bác Hạ và anh Tot77 sức khoẻ và thành công. ^^

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

Hàm của anh Tot77 em có thể biến tấu được mà.

Chỉ cần phần nguyên là đủ, giống như hàm Randombetween rồi ạ.

Phần Nguyên+0.1*rand(a,b)+0.01*rand(c,d)+0.001*rand(e,f)...........

Như vậy là OK rồ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

Với góp ý anh Tot77 em có chương trình gửi lên để ai cần mng dùng.

(defun c:SRD(/ );;;;SO RANDOM
(setq i 0)
(setvar "CMDECHO" 0)
(or *a* (setq *a* 0))
(setq a (getreal (strcat "\n \nNhap so nho:  <"
		  (rtos *a* 2 0)
		 "> :"
	  )
 )
)
(if (not a) (setq a *a*) (setq *a* a))
(or *b* (setq *b* 10.0))
(setq b (getreal (strcat "\n \nNhap so lon: <"
		  (rtos *b* 2 0)
		 "> :"
	  )
 )
)
(if (not b) (setq b *b*) (setq *b* b))
(or *h* (setq *h* 1.00))
(setq h (getreal (strcat "\n \nNhap chieu cao chu: <"
		  (rtos *h* 2 2)
		 "> :"
	  )
 )
)
(if (not h) (setq h *h*) (setq *h* h))
(if (< a b)
    (progn
	(while
		(setq Pnt (getpoint "\nChon diem Pick ghi so ngau nhien: "))
	  	(setq NumberRandom (+ (rand1 a b) (* 0.1 (rand2 0 9)) (* 0.01 (rand2 0 9))))
		(Entmake (list (cons 0 "TEXT") (cons 10 Pnt) (cons 1 (rtos NumberRandom 2 2)) (cons 40 h)))

	)
     )
     (Alert "Ban nhap so a lon hon so b roi! Nhap lai nhe ban")
)
(princ)
)


(defun rand1 (a b)
    (+ a (fix (* (- b a) (atof (strcat "0." (substr (rtos (getvar 'cdate) 2 18) 16 2))))))
)
(defun rand2 (a b)
    (+ a  (* (- b a) (atof (strcat "0." (substr (rtos (getvar 'cdate) 2 18) 16 2)))))
)
  • Like 1

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

1. Nhiều chuyện xíu để lỡ có sai thì lại đc 1 củ

2. Để đánh dấu cho dễ tìm :D

 

Cho hỏi: tại sao phải dùng tới (rtos (getvar 'cdate) 2 18) ?

Phải chăng là nhầm 8 thành 18 (lỗi đánh máy), vì mình thấy cad chỉ lấy đến phần trăm của giây thì phải ?!

Thanks !

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

Nói chung chẳng thấy báo lỗi gì cả nên cứ xài như vậy.  :mellow:

Thật ra cũng chỉ cần 8 là đủ, dư chút càng "sang" chứ chẳng ảnh hưởng gì. :)

Rốt cuộc nó chì lấy 2 số dưới số giây (1/100 giây).

Quan trọng là 2 số 16 2 phía sau thôi.

  • Vote tăng 1

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
Vào lúc 30/8/2014 tại 18:08, thanhduan2407 đã nói:

Với góp ý anh Tot77 em có chương trình gửi lên để ai cần mng dùng.


(defun c:SRD(/ );;;;SO RANDOM
(setq i 0)
(setvar "CMDECHO" 0)
(or *a* (setq *a* 0))
(setq a (getreal (strcat "\n \nNhap so nho:  <"
		  (rtos *a* 2 0)
		 "> :"
	  )
 )
)
(if (not a) (setq a *a*) (setq *a* a))
(or *b* (setq *b* 10.0))
(setq b (getreal (strcat "\n \nNhap so lon: <"
		  (rtos *b* 2 0)
		 "> :"
	  )
 )
)
(if (not b) (setq b *b*) (setq *b* b))
(or *h* (setq *h* 1.00))
(setq h (getreal (strcat "\n \nNhap chieu cao chu: <"
		  (rtos *h* 2 2)
		 "> :"
	  )
 )
)
(if (not h) (setq h *h*) (setq *h* h))
(if (< a b)
    (progn
	(while
		(setq Pnt (getpoint "\nChon diem Pick ghi so ngau nhien: "))
	  	(setq NumberRandom (+ (rand1 a b) (* 0.1 (rand2 0 9)) (* 0.01 (rand2 0 9))))
		(Entmake (list (cons 0 "TEXT") (cons 10 Pnt) (cons 1 (rtos NumberRandom 2 2)) (cons 40 h)))

	)
     )
     (Alert "Ban nhap so a lon hon so b roi! Nhap lai nhe ban")
)
(princ)
)


(defun rand1 (a b)
    (+ a (fix (* (- b a) (atof (strcat "0." (substr (rtos (getvar 'cdate) 2 18) 16 2))))))
)
(defun rand2 (a b)
    (+ a  (* (- b a) (atof (strcat "0." (substr (rtos (getvar 'cdate) 2 18) 16 2)))))
)

Cho em được đào mộ ạ!

Có 1 vấn đề là lisp này chỉ chạy đúng với số tự nhiên, hoặc hiệu số lớn - số nhỏ là số tự nhiên.

Với số thực bất kỳ thì kết quả trả về có rất nhiều số lớn hơn cận trên khoảng nhập vào ạ.

Em nhờ các bác xem xét ạ. Em cảm ơn nhiều!

 

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

×