Author Topic: RND - in_range  (Read 2232 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3274
  • Marko Ribar, architect
RND - in_range
« on: November 25, 2013, 11:19:23 AM »
Hi, I need RND number generator in_range - fox ex. range=[0,25] => 3, 9, 1, 5, 12, 13, 2, 0, ..., 25 - but not : 26, 29, 40...

It is the most welcomed if in code is used (dos_random) function... Ex. for range=[0,9] => simple (rem (dos_random) 10), but I want range=[0,n]... Then the same RND generator can be used for range=[-n,n], just randomly switching sign...

Thanks, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3274
  • Marko Ribar, architect
Re: RND - in_range
« Reply #1 on: November 25, 2013, 11:34:54 AM »
I solved it IMO:

Code - Auto/Visual Lisp: [Select]
  1. (defun rnd[0-n] ( n / [0-1] [0-n] )
  2.   (setq [0-1] (atof (strcat "0." (itoa (dos_random)))))
  3.   (setq [0-n] (fix (* [0-1] (1+ n))))
  4.   [0-n]
  5. )
  6.  

Any suggestions are welcomed...
M.R.
« Last Edit: November 26, 2013, 09:40:04 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

GP

  • Newt
  • Posts: 83
  • Vercelli, Italy
Re: RND - in_range
« Reply #2 on: November 25, 2013, 12:04:48 PM »

Keith™

  • Villiage Idiot
  • Seagull
  • Posts: 16899
  • Superior Stupidity at its best
Re: RND - in_range
« Reply #3 on: November 25, 2013, 12:12:44 PM »
I wrote a similar function a couple of years ago, but I can't seem to find it right now.
Proud provider of opinion and arrogance since November 22, 2003 at 09:35:31 am
CadJockey Militia Field Marshal

Find me on https://parler.com @kblackie

reltro

  • Guest
Re: RND - in_range
« Reply #4 on: November 25, 2013, 12:13:12 PM »
I do it this way...

Code: [Select]
(defun RandomRange (u o / r)
   (setq seedStore '%)
   (setq r
      (   (lambda (seed / modulus multiplier increment)
            (if (not seed)
               (setq seed (getvar 'date))
            )
           
            (setq modulus       65536
                  multiplier    25173
                  increment     13849
            )
            (setq seed (rem (+ (* multiplier seed) increment) modulus))
            (list seed (/ seed (float modulus)))
         )
         (eval seedStore)
      )
   )
   (set seedStore (nth 0 r))
   (setq o (1+ o))
   (fix (+ u (* (- o u) (nth 1 r))))
)

(RandomRange 10 25)

ribarm

  • Gator
  • Posts: 3274
  • Marko Ribar, architect
Re: RND - in_range
« Reply #5 on: November 25, 2013, 12:51:09 PM »
Thanks, here is where I just used my DosLib version...

http://www.theswamp.org/index.php?topic=45751.new#new

Regards, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

GP

  • Newt
  • Posts: 83
  • Vercelli, Italy
Re: RND - in_range
« Reply #6 on: November 25, 2013, 01:17:27 PM »
...here is where I just...

LM:True->RGB
LM:RGB->HSL
LM:HSL->RGB
LM:True->HSL

Why compel to install DOSlib and not use also
LM:rand and LM:randrange

 :-)

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: RND - in_range
« Reply #7 on: November 25, 2013, 11:48:11 PM »
Old one of mine from my Caddons's Math lib: http://sourceforge.net/p/caddons/code/HEAD/tree/Libraries/Math.LSP

Code - Auto/Visual Lisp: [Select]
  1. ;;; -------------------------------------------------------------------------------------
  2. ;;; Pseudo random number generator
  3. ;;; -------------------------------------------------------------------------------------
  4. ;;; seed : A number as the seed, nil to auto-generate
  5. ;;; Result: real value between 0.0 and 1.0
  6. ;;; -------------------------------------------------------------------------------------
  7. (defun Random  (seed /)
  8.   (if (not seed)
  9.     (setq seed (if *random:seed*
  10.                  *random:seed*
  11.                  (setq *random:seed* (getvar "DATE"))))
  12.     (setq *random:seed* seed))
  13.   (setq seed          (rem (+ (* 25173 seed) 13849) 65536)
  14.         *random:seed* seed)
  15.   (/ seed 65536))
  16.  
  17. ;;; -------------------------------------------------------------------------------------
  18. ;;; Pseudo random number generator between minimum & maximum values
  19. ;;; -------------------------------------------------------------------------------------
  20. ;;; minimum: The minimum value
  21. ;;; maximum: The maximum value
  22. ;;; seed   : A number as the seed, nil to auto-generate
  23. ;;; Result : real value between 0.0 and 1.0
  24. ;;; -------------------------------------------------------------------------------------
  25. (defun RandomMinMax  (minimum maximum seed / diff rand)
  26.   (setq diff    (max minimum maximum)
  27.         minimum (min minimum maximum)
  28.         maximum diff
  29.         diff    (- maximum minimum)
  30.         rand    (Random seed))
  31.   (if (= (type minimum) (type maximum) 'INT)
  32.     (fix (+ minimum (* diff rand)))
  33.     (+ minimum (* diff rand))))

They all do basically the same thing, some even use the exact same formula to calculate the random-ness of the number. Even the doslib alternative does something similar (just through ARX, but might use a different seed value). There are nearly no "true" random number generators. Though for most uses these pseudo random generators are adequate.

One example of a "true" random number: http://www.theswamp.org/index.php?topic=41820.msg469407#msg469407 Basically that just reads a number from a site - this number is generated by some natural phenomenon (e.g. the radiated particle count at any specific time of an unstable element).
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

Stefan

  • Bull Frog
  • Posts: 319
  • The most I miss IRL is the Undo button
Re: RND - in_range
« Reply #8 on: November 26, 2013, 03:33:20 AM »
Using dos_random and integer numbers

Code - Auto/Visual Lisp: [Select]
  1. (defun rnd_range (a b)
  2.   (+ (rem (dos_random) (1+ (abs (- b a)))) (min a b))
  3.   )
  4.  
  5. (defun rnd_range_list (a b n / l)
  6.   (repeat n
  7.     (setq l (cons (rnd_range a b) l))
  8.     )
  9.   )
  10.  
  11. (defun rnd_range_unique_list (a b n / i l r)
  12.   (setq i (setq i (1+ (abs (- b a))))
  13.         n (min n i)
  14.         a (min a b)
  15.         )
  16.   (repeat i
  17.     (setq l (cons (setq i (1- i)) l))
  18.     )
  19.   (repeat n
  20.     (setq r (cons (nth (rem (dos_random) (length l)) l) r)
  21.           l (vl-remove (car r) l)
  22.           )
  23.     )
  24.   (mapcar '(lambda (x) (+ x a)) r)
  25.   )

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
Re: RND - in_range
« Reply #9 on: November 26, 2013, 09:34:32 AM »
This is old but collection from my library.
Code - Auto/Visual Lisp: [Select]
  1. ;; http://www.theswamp.org/index.php?topic=25248.msg303911#msg303911
  2. ;;  to limit to a range of random numbers
  3. (+ in (* (- out in) (randomize)))
  4.  
  5. ;;============================================================
  6.  
  7. ;;  http://www.theswamp.org/index.php?topic=8203.0
  8.  
  9. ;; Luis
  10. (defun ran ()
  11. (setq seed (if seed (rem (+ (* seed 15625.7) 0.21137152) 1) 0.3171943)))
  12.  
  13. ;;  Crank
  14. (defun c:random ()
  15.     (if (not seed)(setq seed 0))
  16.     (setq seed (+ (getvar "TDUSRTIMER") seed) seed (+ seed (* seed (+ seed pi) 0.731)) seed (rem seed 1))
  17. )
  18.  
  19.  
  20.  
  21. ;;  http://www.theswamp.org/index.php?topic=10883.msg137525#msg137525
  22. (defun randomize ()
  23. ;  (setq rn (+ 1(* randm (getvar "tdusrtimer"))))
  24.   (if (not seed)
  25.     (setq seed (getvar "DATE"))
  26.   )
  27.   (setq modulus    65536
  28.         multiplier 25173
  29.         increment  13849
  30.         seed  (rem (+ (* multiplier seed) increment) modulus)
  31.         random     (/ seed modulus)
  32.   )
  33. )
  34. )
  35.  
  36.  
  37. ;;   http://www.theswamp.org/index.php?topic=2523.msg31984#msg31984
  38. ;;  Stig
  39. (defun rng (/ modulus multiplier increment random)
  40.   (if (not seed)(setq seed (getvar "DATE")))
  41.   (setq modulus    4294967296.0 multiplier 1664525 increment 1
  42.         seed       (rem (+ (* multiplier seed) increment) modulus)
  43.         random     (/ seed modulus))
  44. )
  45.  
  46. ;;============================================================
  47.  
  48.   (defun rn (/ md mx nc ) ; Random number generator, from 1 to 6
  49.     (or sd (setq sd (getvar "DATE")))
  50.     (setq md 65536 mx 25173 nc 13849
  51.           sd (rem (+ (* mx sd) nc) md)
  52.     )
  53.     (1+ (fix (/ (* (/ sd md) 10) 2)))
  54.   )
  55.  
  56.  
  57. (defun rn (/ md mx nc ) ; Random number generator, from 0.000 to 0.999
  58.    (if (not sd) (setq sd (getvar "DATE")))
  59.    (setq md 65536 mx 25173 nc 13849 sd (rem (+ (* mx sd) nc) md))
  60.    (/ sd md)
  61. )
  62.  
  63.  
  64. (defun rn (/ md mx nc nx) ; Random number generator
  65.    (if (not sd) (setq sd (getvar "DATE")))
  66.    (setq md 65536 mx 25173 nc 13849 sd (rem (+ (* mx sd) nc) md))
  67.    (setq nx (/ sd md)) ; from 0.000 to 0.999
  68.    (+ 2 (* 10 (/ nx 4))) ; real from 2 to 4.499
  69. )
  70.  
  71.  
  72. ;;============================================================
  73.  
  74.  
  75. ;; http://www.theswamp.org/index.php?topic=25248.msg303904#msg303904
  76. ;;  by MP
  77. (defun _Random ( )
  78.  
  79.     ;;  Original lisp version attributable to Paul Kahut,
  80.     ;;  who translated an algorythm from a Visual C 4.1
  81.     ;;  library. Abused by MP so it's self initializing
  82.     ;;  and returns a float between 0 and 1 rather than
  83.     ;;  an int.
  84.  
  85.     (/
  86.         (+ 2147483648
  87.             (setq *randomseed*
  88.                 (+
  89.                     (*
  90.                         (if (numberp *randomseed*)
  91.                             (fix *randomseed*)
  92.                             (getvar "millisecs")
  93.                         )
  94.                         214013
  95.                     )
  96.                     2531011
  97.                 )
  98.             )
  99.         )
  100.         4294967295.0
  101.     )    
  102. )
  103.  
  104. ================================================
  105.  
  106.     (defun RandomGenerator (Num)
  107.         (* (/ (* Num (sqrt (getvar 'MilliSecs))) 11 ) 33.99 )
  108.     )
  109.  
  110. ==================================================
  111.    
  112.    
  113. (defun random-in-range ( minNum maxNum / randnum )
  114.   ;; returns a real number between minNum and maxNum.
  115.   ;;
  116.   ;; By: Stig Madsen
  117.   ;;     slightly modified by me
  118.   (defun randnum ( / modulus multiplier increment random)
  119.     ;; Randnum.lsp
  120.     ;; Returns a random number.
  121.     ;; Written by Paul Furman, 1996.
  122.     ;; Based on algorithm by Doug Cooper, 1982.
  123.     (if (not seed)
  124.       (setq seed (getvar "DATE")))
  125.     (setq       modulus   65536
  126.                 multiplier 25173
  127.                 increment  13849
  128.                 seed  (rem (+ (* multiplier seed) increment) modulus)
  129.                 random (/ seed modulus)) )
  130.   (if (not (< minNum maxNum))
  131.     (progn
  132.       (setq tmp minNum
  133.             minNum maxNum
  134.             maxNum tmp
  135.             )
  136.       )
  137.     )
  138.   (setq rand (fix (+ (* (randnum) (- (1+ maxNum) minNum)) minNum)))
  139.  )
  140.  
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.