wangshang323 发表于 2013-3-9 00:18:39

关于随机函数

本帖最后由 wangshang323 于 2013-3-9 00:24 编辑

最近需要个随机函数,大致找了下坛子里。发现好像关于这个的很少。只找到了一个生成0到1之间的随机函数。我需要的是提供(开始数 结尾数)这样2个数之间的随机函数。虽然初学,还是写了点。
【思路】 0到1之间的已经有人写了, 那么得到0到9就简单(乘以10 再取整数 就可以)。但是这只能得到0到10 与我想要到(7 100)7到100之间的随机函数还是有区别。 那就先吧7到100之间的数 按10个为一表 得到一个表aa, 先随机得到一个数比如4 那就选(40 41 42 43 44 45 46 47 48 49 )这组 在随机一个数 比如6 就得到45这个随机数了。

(defun DSJHS ( )
    (fix(* (/ (rem (getvar "CPUTICKS") 1984) 1983)10))
)
(defun ROLL (strn endn / aa k re)
(if (and strn endn)
    (progn (setq k strn )
   (repeat (- endn strn)
   (setq aa (append (list k) aa) k (+ k 1))
   )   
   (setq aa (shigeyizu (reverse aa)))
(while(not (and (/= (setq re (nth (DSJHS) aa)) nil) (not (equal (type re) 'LIST))));当re不为空且不为表的时候就退出循环。
   (if (and re (equal (type re) 'LIST) )
   (setq aa re)
    );当re为表时候就让aa等于子表 再循环。否则则是RE为空 就循环下去。
)
   )
)
re
)
(defun c:tt (/ aa bb i)
(print (ROLL 1 100))
(princ)
)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;    【通用子函数】 给定一个表 返回10个为一组的新表
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(defun shigeyizu (tmpb / i k tmb tmpzb re)
(if tmpb
    (progn   
       (setq i 0 k 0 tmb nil tmpzb nil)
   (repeat (length tmpb)
    (if (= k 10)
    (setq tmb (append (list (reverse tmpzb)) tmb)k 0 tmpzb nil)
    )
    (setq tmpzb(append(list (nth i tmpb)) tmpzb))
    (setq k (+ 1 k) i (+ 1 i) )
   )
   (setq tmb (reverse(append (list (reverse tmpzb)) tmb) ))
   (if(<= (length tmb) 10) (setq re tmb)
      (setq re (shigeyizu tmb))
   )
)
)
re
)
【祝大家新年roll 100!】

革天明 发表于 2013-3-9 08:41:12

本帖最后由 革天明 于 2013-3-9 08:44 编辑

http://bbs.mjtd.com/thread-100442-2-1.html
看12楼, 我的程序会根据区间a,b的小数位数自动调整生成的随机数的小数位数,我卡壳的有两个地方,一个是我不能实现限制重复数的重复次数,我的只能实现相连的数字肯定是不重复的;另一个是我生成的是字符串,如本来应该是“2.50”的,我实现的字符串是“2.5”,我的还是根据输入的字符串来计算小数位数的

wangshang323 发表于 2013-3-9 12:56:42

革天明 发表于 2013-3-9 08:41 static/image/common/back.gif
http://bbs.mjtd.com/thread-100442-2-1.html
看12楼, 我的程序会根据区间a,b的小数位数自动调整生成的随 ...

呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有简化 写的很啰嗦。
        ;++++++++++++【子函数】++++++++++++
        (defun DSJHS ( )
                (fix(* (/ (rem (getvar "CPUTICKS") 1984) 1983)10))
        )
        (defun ROLL (strn endn / aa k re)
          (if (and strn endn)
                (progn (setq k strn )
                  (repeat (- endn strn)
                        (setq aa (append (list k) aa) k (+ k 1))
                  )          
                  (setq aa (shigeyizu (reverse aa)))
                (while(not (and (/= (setq re (nth (DSJHS) aa)) nil) (not (equal (type re) 'LIST))));当re不为空且不为表的时候就退出循环。
                  (if (and re (equal (type re) 'LIST) )
                       (setq aa re)
                   );当re为表时候就让aa等于子表 再循环。否则则是RE为空 就循环下去。
                )       
           )
          )
          re
        )
        (defun shigeyizu (tmpb / i k tmb tmpzb re)
          (if tmpb
                (progn        
                       (setq i 0 k 0 tmb nil tmpzb nil)
                       (repeat (length tmpb)
                          (if (= k 10)
                               (setq tmb (append (list (reverse tmpzb)) tmb)k 0 tmpzb nil)
                          )
                          (setq tmpzb(append(list (nth i tmpb)) tmpzb))
                          (setq k (+ 1 k) i (+ 1 i) )
                       )
                       (setq tmb (reverse(append (list (reverse tmpzb)) tmb) ))
                       (if(<= (length tmb) 10) (setq re tmb)
                                  (setq re (shigeyizu tmb))
                       )               
                )
          )
          re
        )
        ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        ;            【子函数】 检查一个表(无子表)是否有连续N个重复的子项
        ;         无 返回nil 有 返回对应的位置表。
        ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++               
        (defun CFBPD(tmpb maxl / i tmp1 dqcs dqzb reb)
          (setq i 0 tmp1 nil dqcs nil dqzb nilreb nil )
          (repeat (length tmpb)
           (if(equal (setq tmp1 (nth i tmpb)) dqcs)             
                   (setq dqzb (append(list (- i 1)) dqzb) )   
                   (if dqzb
                       (progn
                          (setq tmzreb (reverse(setq dqzb (append(list (- i 1)) dqzb) )))
                           (if (> (length tmzreb) maxl) (setq reb(append(list tmzreb) reb)))
                           (setq dqcs tmp1 dqzb nil)
                          )
                          (setq dqcs tmp1 dqzb nil ))
                )          
                (setq i (+ 1 i))
          )
          (if dqzb (setq reb(append(list (reverse(setq dqzb (append(list (- i 1)) dqzb) ))) reb)dqcs tmp1 dqzb nil))   
          (reverse reb)
        )
       
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;            【子函数】 替换重复位置表;         
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
(defun THCFB(mub cfwzb ksn ndn / i reb zcfwb k dwz)
(if (andmub cfwzb)
(progn
   (setq i 0 reb mub)   
   (repeat (length cfwzb)
   (setq zcfwb (nth i cfwzb) k 0)
       (repeat (length zcfwb)
           (setq dwz (nth k cfwzb))
           (setq reb (ISTTH reb dwz (ROLL ksn ndn)))
           (setq k (+ k 1))
          )
          (setq i (+ i 1))
        )
   )
)
reb
)

(defun c:tt (/ )
   (setq a (getint "\n随机数下限:"))
   (setq b (getint "\n随机数上限:"))
   (setq c (getint "\n随机数个数:"))
   (setq n (getint "\n随机数最多重复次数:"))
   (repeat c
   (setq ksb (append (list (ROLL a b)) ksb))
        )
   (while (setq tmp (CFBPD ksb n))
      (setq ksb (THCFB ksb tmp a b))
        )
        (print ksb)
        (princ)
)
       
          
          
   






   
          
   
               
       

革天明 发表于 2013-3-11 10:15:57

wangshang323 发表于 2013-3-9 12:56 static/image/common/back.gif
呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有 ...

(4 4 2 2 4 4 4 2 1 1 1 2 2 1 1 3 3 1 2 1 1 2 4 2 2 2 2 2 4 1 1 3 3 4 3 1 3 4 2 2 4 3 4 2 2 4 1 2 2 1 4 3 3 2 2 2 4 1 1 2 2 4 2 1 2 1 4 4 1 4 2 1 1 2 2 4 4 2 1 1 2 1 3 1 1 1 4 3 1 2 1 2 2 4 4 2 1 1 1 1 2 4 1 2 4 1 2 1 2 2 1 3 1 2 4 3 1 4 4 3 1 4 2 3 3 2 2 3 2 1 2 2 1 2 1 2 3 2 2 4 1 3 1 4 2 2 1 2 3 3 4 1 4 3 3 2 2 1 4 1 2 2 1 3 2 2 1 2 2 1 4 2 1 2 1 3 3 2 2 3 1 2 3 1 1 1 2 1 4 4 4 4 4 2 1 1 1 2 2 4)1-10 200个,连续3个不重复
我的做法是先生成一个200个数字的表,用一个处理函数,将连续次数过多的数字去掉几个,不足200的,再生成一个200-N的表,与处理后表append,再处理,一直循环到符合要求,但这个处理函数我不太会写

chenbh2 发表于 2015-1-5 10:22:32

wangshang323 发表于 2013-3-9 12:56 static/image/common/back.gif
呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有 ...

你这个随机lisp很好,
但是我需要运行一次取一个随机数,不要"()",可以用于写入到CAD图中.
希望帮忙修改下,我弄了好久都搞不好.

不死猫 发表于 2015-1-5 10:47:54

(setq *ScriptControl (vlax-get-or-create-object "MSScriptControl.ScriptControl"))
        (if *ScriptControl
                (progn
                        (vlax-put *ScriptControl 'Language "VBS")
                        (vlax-invoke *ScriptControl 'ExecuteStatement "Randomize\nFunction Rand(x,y)\nRand=x+Rnd*(y-x)\nEnd Function")
                )
        )
(setq num (fix (vlax-invoke *ScriptControl 'run "Rand" 100 999)))

小诚 发表于 2015-3-2 09:42:04

一楼这种随机数………
7到10
(+ 7 (rem (getvar "CPUTICKS") 4))
猫老师的方法 不懂ScriptControl对象,就是想问一下是不是调用系统api的结果
页: [1]
查看完整版本: 关于随机函数