关于随机函数
本帖最后由 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:44 编辑
http://bbs.mjtd.com/thread-100442-2-1.html
看12楼, 我的程序会根据区间a,b的小数位数自动调整生成的随机数的小数位数,我卡壳的有两个地方,一个是我不能实现限制重复数的重复次数,我的只能实现相连的数字肯定是不重复的;另一个是我生成的是字符串,如本来应该是“2.50”的,我实现的字符串是“2.5”,我的还是根据输入的字符串来计算小数位数的 革天明 发表于 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)
)
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,再处理,一直循环到符合要求,但这个处理函数我不太会写
wangshang323 发表于 2013-3-9 12:56 static/image/common/back.gif
呵呵昨天晚上看片去了。上午睡觉去了。呵呵
想了下你的要求 结合昨晚写的随机函数 写了下面的。程序没有 ...
你这个随机lisp很好,
但是我需要运行一次取一个随机数,不要"()",可以用于写入到CAD图中.
希望帮忙修改下,我弄了好久都搞不好. (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))) 一楼这种随机数………
7到10
(+ 7 (rem (getvar "CPUTICKS") 4))
猫老师的方法 不懂ScriptControl对象,就是想问一下是不是调用系统api的结果
页:
[1]