cg-Cad

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