明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2882|回复: 6

[基础] 关于随机函数

[复制链接]
发表于 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”,我的还是根据输入的字符串来计算小数位数的
 楼主| 发表于 2013-3-9 12:56:42 | 显示全部楼层
革天明 发表于 2013-3-9 08:41
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 nil  reb 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 (and  mub 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
呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有 ...

(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,再处理,一直循环到符合要求,但这个处理函数我不太会写

发表于 2015-1-5 10:22:32 | 显示全部楼层
wangshang323 发表于 2013-3-9 12:56
呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有 ...

你这个随机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的结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 14:54 , Processed in 0.178241 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表