cg-Cad

Lisp »Tips 'n Tricks »Numeri Interi Casuali

(random numero_intero) imita la funzione random(numero_intero) del linguaggio Pascal.

(random n)

;|
   (random n) (10 Luglio 2005)
   Copyright (C) 2005 Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Estrae un numero intero casuale da 0 a x-1
   Il seme e' inizializzato con la variabile DATE
   in questo modo la serie di numeri casuali
   e' diversa in ogni sessione di gioco.
|;

(defun random ( x / m b c) 
 (if (not sd) (setq sd (getvar "DATE")))
 (setq m 65521 b 15937 c 33503)
 (setq sd (rem (+ (* b sd) c) m))
 (fix (* (/ sd m) x))
)

;|
   AutoLISP Tips & Tricks Volume I
   [37] Numeri Casuali
|;
(defun rn ( / m b c ) 
 (if (not seed)(setq seed (getvar "DATE")))
 (setq m 65521 b 15937 c 33503) 
 (setq seed (rem (+ (* b seed) c) m))
 (* (/ seed m) 15)
)

(defun c:test ( / i )
 (setvar "cmdecho" 0)
 (repeat (1+ (fix (rn))) ; da 1 a 15 ripetizioni
  (setq i (random 10))   ; numeri [0-9]
  (princ " i=")
  (princ i)
 )
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

TEST i=0 i=9 i=8 i=6
TEST i=2 i=2 i=9 i=3 i=9
TEST i=4 i=8 i=8 i=0 i=8 i=1 i=2 i=8
TEST i=1 i=7 i=4 i=7 i=0 i=9 i=5 i=8 i=1
TEST i=4 i=1 i=9 i=3 i=9 i=8
TEST i=7 i=7 i=5 i=7 i=3 i=7 i=0 i=8 i=4 i=6 i=3
TEST i=9 i=0 i=3 i=0 i=6 i=9 i=6 i=1 i=1 i=6 i=2 i=5
TEST i=2 i=3 i=7 i=9 i=4 i=8 i=3 i=7 i=0 i=0 i=2 i=9 i=3
TEST i=6 i=5 i=4
TEST i=3 i=6 i=4 i=5 i=0 i=9 i=4 i=5 i=3 i=6 i=6 i=0 i=0 i=9 i=2
TEST i=3

Test con (random 100):
TEST i=45 i=87 i=26 i=35 i=13 i=81 i=31 i=53 i=8 i=43 i=98 i=64 i=17
TEST i=57 i=45 i=19 i=12 i=84 i=4 i=26
TEST i=69 i=80 i=15 i=57 i=28 i=65 i=54 i=86 i=71 i=31 i=30 i=6
TEST i=19 i=78 i=43 i=62

Trick

Le variabili sd e seed sono variabili fantasma né dichiarate né inizializzate.

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 10 Luglio 2005