・ 乱数を取得する
AutoLispには乱数を発生させる関数はありません
ObjectARXで作るか、VB の Rnd 関数を用いることになります
また、正確には乱数とはいえませんが、システム変数 CDATE
のコンマ秒の値を取得して、簡易乱数とすることもできます
例1:doslib (ObjectARX)を使う
(arxload (findfile "doslib2k.arx"))
(dos_random)
26897 みたいな乱数(32767〜0)が返ってきます。
最新版はここから
http://www.mcneel.com/cgi-bin/download.cgi?doslib
参考文献:「おぉとりすぷの広場」 記事番号<17492>
例 2:VBAのプロシージャーを呼び出す
sample_get_rnd_vba.lspへの記述
;/////////////////////////////////////////////////////////////////////////////////////////////////
;*** sample_get_rnd_vba 乱数を取得する
By Kamijo 2003/06/09***
;
; VBA のプロシージャー C:\vba_test\sample_rnd.bvd の sample_rnd を呼び出します
; VBA のプロシージャー sample_rnd は、sample_get_rand_vba2 を呼び出します
; VBA → Lisp の変数の受け渡しに、グローバル変数 *int_rnd* を使用しています
;/////////////////////////////////////////////////////////////////////////////////////////////////
(defun sample_get_rnd_vba()
(vl-vbaload "C:\\vba_test\\sample_rnd.dvb")
(vl-vbarun "sample_rnd")
)
(defun sample_get_rnd_vba2()
(setq int_min (getint "\nいくつから"))
(setq int_max (getint "\nいくつまで"))
(if (and (< int_min int_max) *int_rnd*)
(progn
(setq *int_rnd* (+ int_min (fix (* *int_rnd* (1+ (- int_max int_min))))))
(princ (strcat "\n乱数:" (rtos *int_rnd*)))
)
)
(setq *int_rnd* nil)
(princ)
)
(princ "\乱数を取得します コマンド:(sample_get_rnd_vba)")
(princ)
Sub sample_rnd()
Dim int_rnd As Single
Randomize
int_rnd = Rnd
ThisDrawing.SendCommand "(setq *int_rnd* " & int_rnd & ")" & vbCr
ThisDrawing.SendCommand "(sample_get_rnd_vba2)" & vbCr
End Sub
例 3:コマンド VBASTMT で VB の Rnd関数を使う
;/////////////////////////////////////////////////////////////////////////////////////////////////
;*** sample_get_rnd_vb 乱数を取得する
By Kamijo 2003/06/09***
;
; コマンド VBASTMT を使用しています
; VBAの実行できる環境で使用してください
; (ユーザー変数 USERI USERR ではうまくいきません)
;/////////////////////////////////////////////////////////////////////////////////////////////////
(defun sample_get_rnd_vb( / int_min int_max inr_rnd)
;***********************************************************************************************;
;サブルーチン(乱数を返す)・・・・VBASTMTを使用 ;
(defun Jof_get_rnd_vb(int_min int_max / usr5_def int_rnd)
(setq usr5_def (getvar "USERS5"))
(setq str_com (strcat "RANDOMIZE :"
"str_a = Cstr (Rnd) :"
"ThisDrawing.SetVariable " (chr 34 ) "USERS5" (chr 34 ) ", " "str_a"))
(command "VBASTMT" str_com)
(setq int_rnd (atof (getvar "USERS5")))
(setvar "USERS5" usr5_def)
(setq int_rnd (+ int_min (fix (* int_rnd (1+ (- int_max int_min))))))
int_rnd
)
;***********************************************************************************************;
;メインルチン (sample_get_rnd_vb);
(setq int_min (getint "いくつから"))
(setq int_max (getint "いくつまで"))
(if (< int_min int_max)
(progn
(setq int_rnd (Jof_get_rnd_vb int_min int_max))
(princ (strcat "\n乱数" (rtos int_rnd)))
)
(princ "\入力値が不正です")
)
(princ)
)
(princ "\n乱数を発生させます コマンド (sample_get_rnd_vb)")
(princ)
例 4:コマンド VBASTMT で VB の Rnd関数を使う
;/////////////////////////////////////////////////////////////////////////////////////////////////
;*** sample_get_rnd_vb 乱数を取得する By Kamijo
2003/06/17***
;
; コマンド VBASTMT を使用しています
; VBAの実行できる環境で使用してください
; VBAから
Lispの変数へ代入してます(ひげさんより教えていただきました)
; SendCommandは、Lispの処理が終了してからでないと実行されないようです
; したがって1回目の処理のために、事前に VBAのRndを実行しておく必要があるようです
;/////////////////////////////////////////////////////////////////////////////////////////////////
(defun sample_get_rnd_vb( / int_min int_max int_rnd)
(setq int_min (getint "いくつから"))
(setq int_max (getint "いくつまで"))
(if (< int_min int_max)
(progn
(command "vbastmt"
"Randomize : ThisDrawing.SendCommand \"(setq $int_rnd \" & Rnd
& \")\" & vbCr")
(setq int_rnd (+ int_min (fix (* $int_rnd (1+ (- int_max int_min))))))
(princ (strcat "\n乱数" (rtos int_rnd)))
)
(princ "\入力値が不正です")
)
(princ)
)
;Lisp読み込み時にVBAのRndを捨て実行
(command "vbastmt"
"Randomize : ThisDrawing.SendCommand \"(setq $int_rnd \" & Rnd
& \")\" & vbCr")
(princ "\n乱数を発生させます コマンド (sample_get_rnd_vb)")
(princ)
参考文献:「おぉとりすぷの広場」 記事番号<17528><17529><17530><17539>
例 5:システム変数 CDATE のコンマ秒を使う
;/////////////////////////////////////////////////////////////////////////////////////////////////
;*** sample_get_rnd_cd 乱数を取得する
By Kamijo 2003/06/09***
;
; システム変数 CDATE のコンマ秒を取得しているだけなので、正式な乱数ではありません
;/////////////////////////////////////////////////////////////////////////////////////////////////
(defun sample_get_rnd_cd( / int_min int_max inr_rnd Jof_get_rnd)
;***********************************************************************************************;
;サブルーチン(乱数を返す) ;
(defun Jof_get_rnd(int_min int_max / int_rnd)
(setq int_rnd (rtos (getvar "CDATE") 2 8))
(setq int_rnd (substr int_rnd 16 2))
(setq int_rnd (/ (atof int_rnd) 100))
(setq int_rnd (+ (fix (* (1+ (- int_max int_min)) int_rnd)) int_min))
int_rnd
)
;***********************************************************************************************;
;メインルチン (sample_get_rnd_cd);
(setq int_min (getint "いくつから"))
(setq int_max (getint "いくつまで"))
(if (and (< int_min int_max) (< (- int_max int_min) 100))
(progn
(setq int_rnd (Jof_get_rnd int_min int_max))
(princ (strcat "\n乱数" (rtos int_rnd)))
)
(princ "\入力値が不正です")
)
(princ)
)
(princ "\n2桁まで(最大値-最小値<100)の乱数を発生させます コマンド (sample_get_rnd)")
(princ)