明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9978|回复: 16

lisp里生成随机数。

  [复制链接]
发表于 2007-11-1 20:17:00 | 显示全部楼层 |阅读模式
我想在一个区域内生成一定数量的随机坐标的园。
这个过程应该不难,但是lisp的函数里,我没有找到可以生成随机数的函数。
请那位大侠帮帮我,我应该怎么实现?谢谢!
发表于 2009-1-17 22:58:00 | 显示全部楼层
(defun @rnd (rmin rmax / e)  ; 产生随机数
    (vla-eval (vlax-get-acad-object)
              "Randomize : ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))")
    (setq e (+ rmin (* (getvar "userr5") (- rmax rmin))))
    (if (= 'int (type rmin) (type rmax)) (fix e) e)
  )
回复 支持 1 反对 0

使用道具 举报

发表于 2007-11-2 21:26:00 | 显示全部楼层

好像是从小东那儿来的

;;; Get a random value
;;;Author: aeo
(defun rnd (rMin rMax)
  (vla-eval (vlax-get-acad-object)
     "ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))"
  )
  (+ rMin (* (getvar "userr5") (- rMax rMin)))
)

回复 支持 1 反对 0

使用道具 举报

发表于 2007-11-2 17:07:00 | 显示全部楼层
本帖最后由 作者 于 2007-11-2 17:14:43 编辑

有几种办法生成伪随机数

就是取一些随时间变化的系统变量的后几位:

(rtos (rem (getvar "DATE") 1) 2 16)
小数字符串的后几位已经失去了具体意义, 可以看做是随机数.

(rtos (getvar "CPUTICKS"))
这个得到的是整数, 它的最后几位也可以看做是随机数.
另: cputicks这个系统变量在帮助里查不到, 兼容性不得而知.
 楼主| 发表于 2007-11-2 19:11:00 | 显示全部楼层
有没有其他办法?
发表于 2007-11-2 20:23:00 | 显示全部楼层
本帖最后由 作者 于 2007-11-2 20:28:51 编辑

如果你了解其他语言是怎么产生伪随机数的
那你就会明白 (getvar "CPUTICKS") 完全可以满足你的要求了
因为随机数本来就是一个理想化的概念
现有的计算机技术产生的所谓随机数都是根据时钟周期产生随机种子, 再经过某种运算生成的伪随机数.
同一个种子产生的伪随机数也是相同的.

cputicks从字面意思理解就是"CPU的滴答音", 推测可能就是CPU的时钟周期.
那也就是说你的程序每进行一步, 这个周期早就跑好几圈了.
你每次读取, 结果一定不同, 并且没有实质上的规律.

不信你可以试试下面的:
(repeat 100 (prompt (strcat "\n" (rtos (rem (getvar "CPUTICKS") 10)))))

另附常见用法:
(rem (getvar "CPUTICKS") 10)   ;0-9
(1+ (rem (getvar "CPUTICKS") 11))   ;1-10
(rem (getvar "CPUTICKS") 65536)   ;0-65535

参考资料:
http://baike.baidu.com/view/1127.html
发表于 2007-11-2 20:45:00 | 显示全部楼层

按照楼上的方法,(repeat 100 (prompt (strcat "\n" (rtos (rem (getvar "CPUTICKS") 10))))),所得的2和7居多,如下:

6
6
9
7
2
2
2
2
2
2
7
2
7
7
2
7
2
7
2
2
2
7
2
2
2
2
2
2
7
7
2
7
2
2
2
2
2
7
2
2
7
2
2
7
7
2
2
7
7
2
7
7
2
7
2
2
7
2
2
2
7
2
2
7
2
2
2
2
2
7
2
2
2
2
2
2
2
2
2
2
2
2
2
7
2
2
7
7
7
2
7
2
2
2
7
2
2
7
2
7

 楼主| 发表于 2007-11-2 22:23:00 | 显示全部楼层

谢谢大家。

尤其谢谢colder,我刚学编程,让我长了不少知识。

谢谢。

发表于 2007-11-2 22:32:00 | 显示全部楼层
你的CAD好奇怪 是哪个版本?

我试过了 机会均等啊
发表于 2009-1-5 20:28:00 | 显示全部楼层
呵呵,编写一个函数,在指定的范围内产生随机实数,比如,指定在-2.0至3.0之间产生随机实数 (sjs min max)
发表于 2009-1-6 10:43:00 | 显示全部楼层
6楼的代码不行,重复执行(rnd 1 2)得到的结果都是一个鸟样.

点评

嘿嘿,我用6楼的代码就每次生成的结果不一样,而且附合平均分布。  发表于 2012-2-6 20:23
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 23:18 , Processed in 0.203799 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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