革天明 发表于 2013-3-4 08:42:13

阿然 发表于 2013-3-3 14:59 static/image/common/back.gif


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

革天明 发表于 2013-3-4 08:46:19

jdlfjk 发表于 2013-3-3 23:04 static/image/common/back.gif
看看
(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 static/image/common/back.gif
运行后鼠标变成漏斗状,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 static/image/common/back.gif
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90817
这里有随机数的讨论,不过高飞老师的随机数分布 ...

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

阿然 发表于 2013-3-4 10:48:38

革天明 发表于 2013-3-4 10:42 static/image/common/back.gif
下面的附件是我写的DLL,大家注册后,我的程序就也以正常运行了,因为里面加有Randomize,所以这个随机数 ...

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

jdlfjk 发表于 2013-3-4 16:12:48

革天明 发表于 2013-3-4 08:46 static/image/common/back.gif
(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 ...

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

Gu_xl 发表于 2013-3-4 20:38:32

阿然 发表于 2013-3-4 10:48 static/image/common/back.gif
顶一个,调用dll的办法生成的随机数是最符合正态分布的,lisp在这方面确实比其他语言差。

Rnd [(number)] 函数
返回一个 Single 类型的随机数。
参数 Number 可选。一个 Single 值或任何有效的 Single 表达式。
返回值:
如果 Number 为      Rnd 生成
小于零         每次都相同的数字,并将 Number 用作种子。
大于零         序列中的下一个随机数。
等于零         最近生成的数字。
未提供         序列中的下一个随机数。
备注:
Rnd 函数返回小于 1 但大于或等于 0 的值。
Number 的值决定了 Rnd 生成随机数的方式。
由于每一次后续调用 Rnd 函数都用序列中前一个生成的数作为下一个数的种子,因此对于任何给定的初始种子都会生成相同的数字序列。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有一个基于系统计时器的种子。
随机函数可定义如下:
(defun _Ran ()
(vla-eval (vlax-get-acad-object) "Randomize : ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))" )
(getvar 'USERR5)
)
注意:若要重复随机数序列,请在使用带数值参数的 Randomize 之前先调用带负参数的 Rnd。使用带有相同 Number 值的 Randomize 不会重复前一序列。
      由于 Random 语句和 Rnd 函数从一个种子值开始,然后生成位于有限范围内的数字,因此,如果某个人知道生成这些数字的算法,他就可以预测结果。
      因此,不应使用 Random 语句和 Rnd 函数生成加密使用的随机数。
请看下面的函数,用同一种子生成10个随机数,产生随机数序列始终是一样的:

(defun c:tt (/ l)
(vla-eval
    (vlax-get-acad-object)
    "Rnd(-2) : Randomize (10) "
)
(repeat 10
    (vla-eval (vlax-get-acad-object)
       " ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))"
    )
    (setq l (cons (getvar 'userr5) l))
)
(princ (reverse l))
(princ)
)
运行 tt命令,始终返回如下序列数:
'(0.175739 0.820543 0.0625842 0.494602 0.661623 0.958838 0.109856 0.216311 0.155918 0.74768)

页: 1 [2] 3
查看完整版本: 如何生成范围在a到b之间的c个随机数,要求数列中连续重复的数字的个数不大于n