Lisp »Tips 'n Tricks
»Numeri casuali in AutoLISP »1 | 2 | 3
Numeri casuali addensati e Roulette
Come già detto un numero casuale è un numero estratto da un insieme di valori equiprobabili. Una volta scritto un programma che stampa a caso n numeri compresi fra 0 e 10, un numero x (pseudo-casuale) ha un'eguale probabilità di uscita di un altro numero y: si dice che la distribuzione dei numeri è uniforme o omogenea.
Può essere utile invece una distribuzione di numeri addensati rispetto a determinati valori, ad esempio la misura dell'altezza dei bambini di 10 anni non si distribuisce in modo uniforme dal valore più basso a quello più alto ma si addensa attorno al valore medio, l'altezza normale di un bambino di 10 anni.
RNU (random non uniforme) è un lisp che salva una serie di numeri a distribuzione non uniforme su file.
Il lisp procede come rrand.lsp solo che per ogni numero estratto ripete l'operazione 10 volte sommando i numeri nella variabile somma che poi divide per 10.
;;;
;;; rnu.lsp (C)2004 by Claudio Piccini
;;; 6 Aprile 2004
;;; http://www.cg-cad.com/
;;;
;;; distribuzione non uniforme
;;; di numeri casuali
;;;
(defun rn ()
(setq m 65521 b 15937 c 33503 sd
(rem (+ (* b sd) c) m)
)
(/ sd m)
)
(defun distr_uniforme (n)
(* (rn) n)
)
(defun dist_non_uniforme ( n / i somma )
(setq i 0)
(setq somma 0)
(while (< i 10)
(setq somma (+ somma (distr_uniforme n)))
(setq i (1+ i))
)
(setq somma (/ somma 10))
)
(defun c:rnu ( / sd f1 nomeDir nf n)
(setq sd 0.0)
(setq nomeDir (getvar "dwgprefix"))
(setq nf (strcat nomeDir "ncnu.txt"))
(setq f1 (open nf "w"))
(initget (+ 1 2 4))
(setq conta (getint "\nQuanti numeri? "))
(initget (+ 1 2 4))
(setq n (getint "\nIntervallo da 0 a? "))
(repeat conta
(setq sx (dist_non_uniforme n))
; salva la stringa sx (itoa sx)
; nel file NCNU.TXT nella cartella attiva
(write-line (itoa (fix sx)) f1)
;(setq sd sx)
)
(close f1)
)
;;;eof
|
Test
Command: rnu
Quanti numeri? 20
Intervallo da 0 a? 10
Output: 6 4 5 5 5 5 5 5 5 4 4 3 3 3 4 5 5 6 3 5
Command: rnu
Quanti numeri? 50
Intervallo da 0 a? 20
Output: 12 10 7 6 6 8 13 5 7 12 9 12 11 10 11 10 9 7 11 10 8 9 9 7 7 12 13 9 10 5 10 9 11 10 8 12 11 7 10 11 10 10 11 8 10 9 10 11 9 11
Per implementare il gioco della roulette, il lancio del dado e simili, questi algoritmi non sono adatti, più utile il metodo visto all'inizio di questo tutorial che preleva un numero arbitrario dalla variabile temporale di Autocad e da quello genera il numero.
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 6 Aprile 2004
|