・ 乱数を取得する

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)



C:\bva_test\sample_rnd.dvbへの記述

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)