找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 339|回复: 0

[每日一码] 伪随机数的测试

[复制链接]

已领礼包: 267个

财富等级: 日进斗金

发表于 2020-2-18 15:31:47 | 显示全部楼层 |阅读模式

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

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

×


;;根据变量生成需根据随机数参数
(defun shuiji_random (fanwei geshu /  date seconds sec cs sjs fanwei geshu geshu_xh fanhui count_j )
         ; (setq cs 111111)
         ;;取6位的数
        (setq date (getvar "DATE"))
        (setq seconds (* 86400.0 (- date (fix date))))
        (setq sec (rtos seconds 2 15))
        (setq sec (substr sec (+ (vl-string-search "." sec) 2) 5))
        (setq sec (strcat "1" sec))
        (setq cs (atoi sec))
        ;;随机值返回表
        (setq sjs '())
        ;;设置随机值的变化范围0-1000
        ; (setq fanwei 1000)
        ;;设置随机值的个数
        ; (setq geshu 1000)
        (setq geshu_xh 1)
        (if (< geshu_xh (+ (fix (/ geshu 100)) 1))
                (setq geshu_xh (+ (fix (/ geshu 100)) 1))
        )
         (repeat geshu_xh
                ; (print (list_1_average (random_1 cs)))
                ;(write-line (rtos (list_1_average (random_1 cs))) file)
                ;;取1000之内的随机数
                (foreach sj (random_1 cs)
                        ; (write-line (itoa (rem (+ (fix (* sj 1000)) 1) 1000)) file)
                        (setq sjs (append sjs (list (rem (+ (fix (* sj fanwei)) 1) fanwei))))
                )
                (setq cs (+ cs 1))
         )
         (setq fanhui '())
         (setq count_j 0)
         (while (< count_j geshu)
                (setq fanhui (append fanhui (list (nth count_j sjs))))
                (setq count_j (1+ count_j))
         )
         (setq fanhui fanhui)
        ; (setq file (open "d:\\tmp.txt" "w"))
        ; (close file)
)
;;;平方取中法计算伪随机数
(defun random_1(x0 / x0 zu s jc_c mode qushu count_i r_1 jc )
        (setq zu '())
        (setq s 3)
        ;;x0整数长为2S
        ;(setq x0 123455)
        (if (/= (strlen (itoa x0)) (* 2 s))
                (progn
                        (print "随机整数长度必须为2S长度!")
                        (quit)
                )
        )
        (setq jc_c x0)
        (setq mode (expt 10 (* 2 s)))
        ;;单次的长度为100
        (setq qushu 100)
        (setq count_i 0)
        ;;设置计从重值
        (setq jc 0)
        (while (< count_i qushu)
                (setq r_1 (w_random_1 s x0))
                ;(print r_1)
                ;;以计重值判断其是否已退化
                (if (= (fix (* r_1 mode)) x0)
                        (progn
                                (setq jc (1+ jc))
                                ;;计重值大于3可认为已退化抛弃后面的生成值
                                (if (> jc 3)
                                        (progn
                                                (setq jc_c (1+ jc_c))
                                                (setq x0 jc_c)
                                                (setq r_1 (w_random_1 s x0))
                                                (setq jc 0)
                                        )
                                )
                        )
                )
                (if (> r_1 0)
                        (setq zu (append zu (list r_1)))
                )
                (setq x0 (fix (* r_1 mode)))
                (setq count_i (1+ count_i))
        )
        ;;测试平均值
        ; (print zu)
        ; (print (list_1_average zu))
        ; (print "---")
        ; (print jc)
        (setq zu zu)
)

;;测试单一组的统计平均值
(defun list_1_average( list_zu / len_list fanhui len_list)
        (setq fanhui 0)
        (setq len_list (length list_zu))
        (foreach sj list_zu
                (setq fanhui (+ fanhui sj))
        )
        (setq fanhui (/ fanhui len_list))
)



;;平方取中法是冯·诺依曼提出的。此法开始取一个2s位的整数,称为种子,
;;将其平方,得4s位整数(不足4s位时高位补0),然后取此4s位的中间2s位作为下一个种子数,
;;并对此数规范化(即化成小于1的2s位的实数值),即为第一个(0,1)上的随机数。以此类推,
;;即可得到一系列随机数。
(defun w_random_1(s x0 / s x0 4s x_0_2 len_0 str_0 x_1_1 u_1)
        ;(setq s 2)
        (setq 4s (* 4 s))
        ;(setq x0 1234)
        ;(setq mode (expt 10 (* 2 s)))
        ;;计算随机数初始值
        (setq x_0_2 (expt x0 2))
        (setq len_0 (strlen (itoa x_0_2)))
        (setq str_0 "")
        (if (< len_0 4s)
                (progn
                        (repeat (- 4s len_0)
                                (setq str_0 (strcat str_0 "0"))
                        )
                )
        )
        (setq str_0 (strcat str_0 (itoa x_0_2)))
        (setq x_1_1 (substr str_0 (+ s 1) (* 2 s)))
        (setq u_1 (/ (atof x_1_1) (expt 10 (* 2 s))))
        (setq u_1 u_1)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 675个

财富等级: 财运亨通

发表于 2020-7-22 17:03:05 | 显示全部楼层
这个范围能设置上限和下限吗,还有重复次数能设定吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 675个

财富等级: 财运亨通

发表于 2020-7-22 17:16:35 | 显示全部楼层
这个范围能设置上限和下限吗,还有重复次数能设定吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 04:10 , Processed in 0.353267 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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