找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2194|回复: 10

[每日一码] 随机数生成函数

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-2-5 00:07:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

[JavaScript] 纯文本查看 复制代码
(defun rand ()
  (setq	seed (if seed
	       (rem (+ (* seed 15625.7) 0.21137152) 1)
	       0.3171943
	     )
  )
)


令: (repeat 10 (princ "\n")(princ(rand)))

0.0126488
0.858366
0.778777
0.152224
0.814014
0.756342
0.587726
0.849062
0.392444
0.421463
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6468个

财富等级: 富甲天下

发表于 2018-2-5 08:25:29 | 显示全部楼层
沙发。支持楼主!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2018-2-5 08:33:05 | 显示全部楼层
这段代码表达的是有序数列,不是随机数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-5 08:42:25 | 显示全部楼层

大师,如何不是随机了,愿闻其详。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2018-2-5 10:17:04 | 显示全部楼层

当seed为空时,取seed为0.3171943,这是全序列第一个数,为定值;
此时seed存在,那么序列的第二个数为(rem (+ (* 0.3171943 15625.7) 0.21137152)1),也为定值(除非违反rem的规则出错);
此时seed存在,那么序列的第三个数和第二个数一样算法,也应该为定值;
以后同样。
这里要说一下,rem函数在某些特定条件下是会出错的(比如某数超出数据位数),但出错后也一定是按照某种规则返回,同样是定数,只是我们不知道其中规则。

对于随机数,严格地说,Lisp是没有此类函数的,目前所使用的方法一般是两种,一是调用VBA的随机函数,二是使用时间模拟,准确地说,使用时间模拟也是有序数列,但如果位数取的足够多,考虑系统运行流畅度对程序的影响,这种模拟也是可以被认可的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-5 12:12:41 | 显示全部楼层
本帖最后由 Lisphk 于 2018-2-5 12:29 编辑

下面是用这个函数生成的矩形的500个随机点,看着还行

搜狗截图20180205121052.png

  1. (defun rand ()
  2.   (setq seed (if seed
  3.                (rem (+ (* seed 15625.7) 0.21137152) 1)
  4.                0.3171943
  5.              )
  6.   )
  7. )
  8. (defun c:tt ()
  9.   (if (and (setq e (car (entsel "\n拾取矩形<退出>:")))
  10.            (setq num (getint "\n随机点数<退出>:"))
  11.       )
  12.     (progn (vla-getboundingbox (vlax-ename->vla-object e) 'ld 'ru)
  13.            (setq ld   (vlax-safearray->list ld)
  14.                  ru   (vlax-safearray->list ru)
  15.                  xmin (car ld)
  16.                  xmax (car ru)
  17.                  ymin (cadr ld)
  18.                  ymax (cadr ru)
  19.            )
  20.            (repeat num
  21.              (setq rnd (rand)
  22.                    x   (+ xmin (* rnd (- xmax xmin)))
  23.                    rnd (rand)
  24.                    y   (+ ymin (* rnd (- ymax ymin)))
  25.                    pt  (list x y 0.0)
  26.              )
  27.              (command ".point" pt)
  28.            )
  29.     )
  30.   )
  31.   (princ)
  32. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-5 12:25:22 | 显示全部楼层

都是“伪随机了”,主要是看种子的选取,尽可能的看起来随机,判断随机数是否好,好像有个正态函数方程。我理解的“有序序列”,就是每次执行得到的结果都是一样的,这样的肯定不是随机数了。但是这个函数执行起来,每次得到的结果很少一样的,特别是在循环里面,每次的间隔时间很短,相邻的数差别很大。

命令: (repeat 10 (princ "\n")(princ (rand))(princ))

0.176973
0.533045
0.40609
0.659055
0.401617
0.75492
0.363896
0.33797
0.230324
0.184701

命令: (repeat 10 (princ "\n")(princ (rand))(princ))

0.291961
0.310965
0.258529
0.911728
0.592928
0.134142
0.27574
0.842065
0.0665068
0.426792

命令: (repeat 10 (princ "\n")(princ (rand))(princ))

0.129601
0.319936
0.432847
0.75403
0.452668
0.470354
0.829671
0.397789
0.948167
0.987636

命令: (repeat 10 (princ "\n")(princ (rand))(princ))

0.722999
0.573534
0.0762111
0.0638111
0.303919
0.165273
0.718875
0.132657
0.0768326
0.775214


下面图片是执行了6次上面的程序,生成的随机点,看着分布挺好的,各个角落都有了,没重复的。

搜狗截图20180205122425.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2018-2-5 12:35:58 | 显示全部楼层

你把seed设置成局部变量看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-5 13:59:03 | 显示全部楼层
本帖最后由 Lisphk 于 2018-2-5 14:01 编辑

就是不能设置成局部变量啊,要的是每次不同的“种子啊”。每次的种子一样,那当然生成的是一样了,不一样机器就不听话了:)

下面用LISP写了个任何曲线内部的随机点生成,多段线可以是“凹”的。看结果,挺“随机的”,每个“凹”的部分都给生成到了。

随机点-lisp.gif

  1. (defun c:tt ()
  2.   (defun XD::List:GroupByNum (lst num / ls ret)
  3.     (if (= (rem (length lst) num) 0)
  4.       (progn (setq ls nil)
  5.              (repeat (/ (length lst) num)
  6.                (repeat num
  7.                  (setq ls  (cons (car lst) ls)
  8.                        lst (cdr lst)
  9.                  )
  10.                )
  11.                (setq ret (append ret (list (reverse ls)))
  12.                      ls  nil
  13.                )
  14.              )
  15.       )
  16.     )
  17.     ret
  18.   )
  19.   (if (and (setq e (car (entsel "\n拾取多边形<退出>:")))
  20.            (setq num (getint "\n随机点数<退出>:"))
  21.       )
  22.     (progn (vla-StartUndoMark
  23.              (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  24.            )
  25.            (vla-getboundingbox
  26.              (setq o (vlax-ename->vla-object e))
  27.              'ld
  28.              'ru
  29.            )
  30.            (setq ld   (vlax-safearray->list ld)
  31.                  ru   (vlax-safearray->list ru)
  32.                  xmin (car ld)
  33.                  xmax (car ru)
  34.                  ymin (cadr ld)
  35.                  ymax (cadr ru)
  36.            )
  37.            (repeat num
  38.              (setq rnd (rand)
  39.                    y   (+ ymin (* rnd (- ymax ymin)))
  40.                    pt1 (list 0.0 y 0.0)
  41.                    pt2 (polar pt1 0.0 1.0)
  42.              )
  43.              (entmake (list '(0 . "XLINE")
  44.                             '(100 . "AcDbEntity")
  45.                             '(67 . 0)
  46.                             '(410 . "Model")
  47.                             '(8 . "0")
  48.                             '(100 . "AcDbXline")
  49.                             (cons 10 pt1)
  50.                             (list 11 1.0 0.0 0.0)
  51.                       )
  52.              )
  53.              (setq e1   (entlast)
  54.                    o1   (vlax-ename->vla-object e1)
  55.                    ints (vla-IntersectWith o1 o acExtendThisEntity)
  56.                    ints (vlax-safearray->list (vlax-variant-value ints))
  57.                    ints (XD::List:GroupByNum ints 3)
  58.                    ints (vl-sort ints '(lambda (x y) (< (car x) (car y))))
  59.                    rnd  (rand)
  60.                    inx1 (fix (+ 0.5 (+ 0 (* rnd (- (length ints) 1)))))
  61.                    inx  (if (= (rem inx1 2) 1)
  62.                           (1- inx1)
  63.                           inx1
  64.                         )
  65.                    pt1  (nth inx ints)
  66.                    pt2  (nth (1+ inx) ints)
  67.                    xmin (car pt2)
  68.                    xmax (car pt1)
  69.                    rnd  (rand)
  70.              )
  71.              (setq x  (+ xmin (* rnd (- xmax xmin)))
  72.                    pt (list x y 0.0)
  73.              )
  74.              (entdel e1)
  75.              (command "point" pt)
  76.            )
  77.            (vla-endundomark doc)
  78.     )
  79.   )
  80.   (princ)
  81. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2019-1-13 09:28:37 | 显示全部楼层
支持楼主!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2021-7-12 04:09:33 | 显示全部楼层
过来学习一下,支持大师源码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-29 04:18 , Processed in 0.320828 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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