明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 革天明

[函数] 如何生成范围在a到b之间的c个随机数,要求数列中连续重复的数字的个数不大于n

  [复制链接]
 楼主| 发表于 2013-3-4 08:42:13 | 显示全部楼层
阿然 发表于 2013-3-3 14:59

运行后鼠标变成漏斗状,3分钟也没停下来,会不会效率低或是死循环?XP CAD2006

点评

如果生成随机数的个数与数的区间个数之间的除数与随机数的重复数接近的话,基本上要生成这样的随机数也没有太大意义!是否能很快得到最终的结果,凭运气啦!  发表于 2013-3-4 11:22
回复

使用道具 举报

 楼主| 发表于 2013-3-4 08:46:19 | 显示全部楼层
jdlfjk 发表于 2013-3-3 23:04
看看
(RandList 1 100 98 2)
(17 36 37 61 63 16 52 4 78 62 6 40 74 63 58 81 77 90 94 94 22 77 53 43  ...

(RANDLIST 1 6 400 3)
(4 3 4 2 4 1 2 4 5 3 1 5 5 1 2 3 5 5 1 1 2 2 4 4 3 3 5 1 3 1 1 5 5 2 3 3 1 1 2 2 3 3 5 3 2 5 1 2 1 1 3 5 2 3 5 3 5 1 2 2 2 1 1 3 5 1 5 5 5 5 2 2 2 5 2 1 2 5 5 1 2 2 5 5 5 3 1 1 5 5 5 5 1 3 2 1 3 5 1 5 5 5 1 1 3 5 2 1 3 2 5 2 2 2 3 2 5 1 2 5 2 5 2 5 1 3 1 5 5 1 1 5 2 3 1 1 1 1 5 1 5 2 2 5 5 1 2 5 2 1 2 3 3 5 2 2 3 1 1 2 2 5 5 1 3 1 5 2 3 2 3 1 1 2 5 2 2 1 1 1 2 1 2 1 2 5 5 1 1 3 3 1 5 2 1 2 3 2 1 3 2 2 5 1 2 5 1 5 3 2 1 3 3 2 5 1 5 3 2 3 3 1 1 1 2 3 3 3 2 1 1 3 3 3 1 2 1 2 2 1 3 1 3 3 2 2 1 5 3 1 1 1 5 3 5 5 2 2 1 3 1 1 1 5 2 5 2 5 1 2 5 2 5 5 2 3 5 3 1 1 1 3 1 3 5 1 1 2 5 1 2 3 2 3 5 5 2 2 5 2 3 3 2 1 1 5 5 3 3 5 1 5 2 2 1 1 1 1 1 3 1 2 2 1 1 1 1 5 1 2 3 1 2 2 3 3 2 1 1 3 3 2 3 3 2 1 2 5 1 5 2 2 1 1 3 2 2 3 3 5 5 3 2 2 3 2 1 5 3 5 2 3 5 1 1 1 2 1 2 5 3 5 3 1 2 1 2 3 3 5 1 3 1 1 2 1 5 3 1 3)
回复

使用道具 举报

 楼主| 发表于 2013-3-4 09:13:08 | 显示全部楼层
本帖最后由 革天明 于 2013-3-4 10:39 编辑

下面是我写的,但不能定义重复的次数,我的只能实现重复一次
(defun pzbsjs-get-rndnum
         (a b c / shulst shulst2 rem-adj2 qjsjs-RNDDLL)
    ;;去掉表中连续重复两项的元素
    ;;(rem-adj2 '(nil nil 1 2 3 3 3 3 32 1 1 1 nil nil))
    ;;(nil 1 2 3 32 1 nil)
    (defun rem-adj2 (l)
      (if (cdr l)
        (if (eq (car l) (cadr l))
          (rem-adj2 (cdr l))
          (cons (car l) (rem-adj2 (cdr l)))
        )
        l
      )
    )
    (defun qjsjs-RNDDLL        (a b c / a1 b1 maxnum shulst shu RNDDLL)
      (setq a1 (vl-prin1-to-string a))
      (setq b1 (vl-prin1-to-string b))
      (if (vl-string-search "." a1)
        (setq a1 (- (strlen a1) (vl-string-search "." a1) 1))
        (setq a1 0)
      )
      (if (vl-string-search "." b1)
        (setq b1 (- (strlen b1) (vl-string-search "." b1) 1))
        (setq b1 0)
      )
      ;;生成随机数,需要RND.dll支持,目前可以自动注册此dll
      (defun RNDDLL (/ rndnum)
        (setq rndnum (vlax-invoke-method
                       (vlax-get-or-create-object "RNDAPP.RND")
                       "GetRND"
                     )
        )
      )
      ;;由于(RNDDLL)返回的是小数点后五位,目前我们使用小数点后三位,就简单一点进行处理
      (setq maxnum (max a1 b1))
      (if (<= (- b a) 0.01)
        (setq maxnum (1+ maxnum))
      )
      (if (> maxnum 3)
        (setq maxnum 3)
      )
      (setq shulst '())
      (repeat c
        (if (> maxnum 0)
          (setq shu (rtos (+ a (* (- b a) (RNDDLL))) 2 maxnum))
          (setq shu (itoa (fix (+ a (* (- b a) (RNDDLL))))))
        )
        (setq shulst (cons shu shulst))
      )
      ;;  (if (= (length (member "0" shulst)) (length shulst))
      ;;    (setq shulst (mapcar '(lambda (x)
      ;;                            ""
      ;;                          )
      ;;                         shulst
      ;;                 )
      ;;    )
      ;;    shulst
      ;;  )
    )
    (setq shulst (rem-adj2 (qjsjs-RNDDLL a b c)))
    (while (< (length shulst) c)
      (setq shulst (rem-adj2 shulst))
      (setq shulst2 (qjsjs-RNDDLL a b (- c (length shulst))))
      (setq shulst (rem-adj2 (append shulst shulst2)))
    )
    shulst
  )
(PZBSJS-GET-RNDNUM 1 100 400)
("16" "61" "37" "21" "68" "19" "93" "27" "33" "7" "97" "43" "4" "98" "34" "64" "78" "49" "2" "17" "12" "5" "73" "75" "50" "91" "78" "65" "21" "11" "14" "13" "95" "35" "55" "39" "29" "90" "28" "24" "67" "77" "32" "14" "37" "96" "67" "35" "13" "20" "35" "88" "46" "3" "8" "72" "84" "63" "12" "62" "54" "81" "48" "83" "30" "32" "89" "37" "63" "87" "62" "22" "2" "74" "66" "11" "71" "67" "2" "33" "47" "18" "69" "85" "80" "73" "42" "44" "19" "60" "46" "60" "88" "79" "82" "81" "64" "3" "23" "34" "97" "58" "23" "92" "36" "46" "27" "9" "6" "64" "36" "30" "8" "15" "4" "56" "15" "70" "76" "41" "53" "58" "80" "31" "23" "50" "17" "52" "25" "1" "57" "5" "32" "56" "57" "89" "70" "43" "61" "79" "40" "62" "70" "1" "42" "85" "38" "54" "48" "41" "11" "39" "87" "29" "15" "28" "57" "47" "51" "50" "59" "97" "18" "3" "65" "53" "90" "60" "4" "41" "95" "77" "74" "33" "31" "98" "76" "83" "72" "51" "82" "39" "45" "10" "21" "26" "49" "26" "91" "45" "84" "47" "92" "62" "46" "93" "18" "19" "52" "32" "6" "23" "42" "2" "24" "59" "63" "4" "48" "99" "16" "11" "30" "99" "1" "49" "18" "4" "90" "19" "10" "13" "12" "21" "60" "80" "64" "28" "16" "53" "49" "92" "3" "57" "39" "36" "22" "93" "60" "38" "45" "34" "14" "45" "1" "33" "98" "10" "88" "38" "87" "53" "7" "47" "10" "55" "31" "15" "62" "13" "87" "20" "27" "1" "91" "37" "96" "92" "27" "58" "72" "43" "94" "11" "6" "98" "67" "69" "44" "85" "71" "59" "14" "5" "8" "7" "89" "29" "49" "33" "23" "84" "22" "18" "61" "71" "26" "8" "31" "89" "61" "29" "7" "14" "29" "81" "40" "95" "2" "66" "78" "56" "6" "56" "48" "75" "42" "77" "24" "26" "82" "31" "57" "81" "55" "15" "95" "68" "60" "5" "65" "61" "95" "26" "41" "12" "63" "79" "74" "67" "36" "37" "13" "54" "40" "54" "82" "73" "76" "75" "57" "96" "17" "28" "91" "52" "17" "86" "30" "40" "21" "3" "99" "58" "30" "24" "2" "9" "97" "50" "8" "64" "70" "35" "47" "51" "74" "25" "17" "44" "11" "46" "19" "94" "51" "98" "25" "50" "83" "63" "37" "55" "73" "34" "56" "64")
_$
回复

使用道具 举报

 楼主| 发表于 2013-3-4 09:16:02 | 显示全部楼层
RNDDLL 函数只是生成【0,1)之间的随机数,http://bbs.mjtd.com/thread-57202-1-1.html
请看我一楼的点评
回复

使用道具 举报

发表于 2013-3-4 10:22:52 | 显示全部楼层
本帖最后由 阿然 于 2013-3-4 10:25 编辑
革天明 发表于 2013-3-4 08:42
运行后鼠标变成漏斗状,3分钟也没停下来,会不会效率低或是死循环?XP CAD2006

看了下,有的时候随机数生成正常,就没有不会死循环,有的时候随机数生成的是固定的数字,就死循环了,我换了gu版的随机数函数,就ok了。核心是随机数生成的函数,剩下的是统计的问题,这个没难度。
回复

使用道具 举报

发表于 2013-3-4 10:32:48 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90817
这里有随机数的讨论,不过高飞老师的随机数分布不太合理
http://bbs.mjtd.com/thread-63955-1-1.html
这个帖子也有讨论,我用的是这个帖子里的办法,不过不太可靠,有的时候可行,有的时候不可行
在vb里面如果直接运行rnd函数是输出固定值,所以在vb内使用rnd的时候之前都要运行一句Randomize,我就加了这么一句。
回复

使用道具 举报

 楼主| 发表于 2013-3-4 10:42:28 | 显示全部楼层
阿然 发表于 2013-3-4 10:32
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90817
这里有随机数的讨论,不过高飞老师的随机数分布 ...

下面的附件是我写的DLL,大家注册后,我的程序就也以正常运行了,因为里面加有Randomize,所以这个随机数才是最随机的

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-3-4 10:48:38 | 显示全部楼层
革天明 发表于 2013-3-4 10:42
下面的附件是我写的DLL,大家注册后,我的程序就也以正常运行了,因为里面加有Randomize,所以这个随机数 ...

顶一个,调用dll的办法生成的随机数是最符合正态分布的,lisp在这方面确实比其他语言差。
回复

使用道具 举报

发表于 2013-3-4 16:12:48 | 显示全部楼层
革天明 发表于 2013-3-4 08:46
(RANDLIST 1 6 400 3)
(4 3 4 2 4 1 2 4 5 3 1 5 5 1 2 3 5 5 1 1 2 2 4 4 3 3 5 1 3 1 1 5 5 2 3 3 1 1 ...

写错了一个函数了,再试试看
回复

使用道具 举报

发表于 2013-3-4 20:38:32 | 显示全部楼层
阿然 发表于 2013-3-4 10:48
顶一个,调用dll的办法生成的随机数是最符合正态分布的,lisp在这方面确实比其他语言差。

Rnd [(number)] 函数
返回一个 Single 类型的随机数。
参数 Number 可选。一个 Single 值或任何有效的 Single 表达式。
返回值:
如果 Number 为      Rnd 生成  
小于零           每次都相同的数字,并将 Number 用作种子。
大于零           序列中的下一个随机数。
等于零           最近生成的数字。
未提供           序列中的下一个随机数。
备注:
Rnd 函数返回小于 1 但大于或等于 0 的值。
Number 的值决定了 Rnd 生成随机数的方式。
由于每一次后续调用 Rnd 函数都用序列中前一个生成的数作为下一个数的种子,因此对于任何给定的初始种子都会生成相同的数字序列。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有一个基于系统计时器的种子。
随机函数可定义如下:
  1. (defun _Ran ()
  2.   (vla-eval (vlax-get-acad-object) "Randomize : ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))" )
  3.   (getvar 'USERR5)
  4.   )

注意:若要重复随机数序列,请在使用带数值参数的 Randomize 之前先调用带负参数的 Rnd。使用带有相同 Number 值的 Randomize 不会重复前一序列。
      由于 Random 语句和 Rnd 函数从一个种子值开始,然后生成位于有限范围内的数字,因此,如果某个人知道生成这些数字的算法,他就可以预测结果。
      因此,不应使用 Random 语句和 Rnd 函数生成加密使用的随机数。
请看下面的函数,用同一种子生成10个随机数,产生随机数序列始终是一样的:
  1. (defun c:tt (/ l)
  2.   (vla-eval
  3.     (vlax-get-acad-object)
  4.     "Rnd  (-2) : Randomize (10) "
  5.   )
  6.   (repeat 10
  7.     (vla-eval (vlax-get-acad-object)
  8.        " ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))"
  9.     )
  10.     (setq l (cons (getvar 'userr5) l))
  11.   )
  12.   (princ (reverse l))
  13.   (princ)
  14. )

运行 tt命令,始终返回如下序列数:
  1. '(0.175739 0.820543 0.0625842 0.494602 0.661623 0.958838 0.109856 0.216311 0.155918 0.74768)


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 19:32 , Processed in 0.192544 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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