明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 224|回复: 4

【分享】随机函数

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
本帖最后由 tigcat 于 2025-8-9 22:26 编辑

在网上搜索+AI分析找到一些随机函数,分享给大家。


1. Xorshift 算法(推荐)
这是目前最受欢迎的轻量级随机数生成器之一:
LISP
;; Xorshift32 算法 - 速度极快
(defun xorshift32 (var / temp)
  (setq seed (cond
               (seed)
               ((abs (getvar var)))
             ))
  (setq temp seed)
  (setq temp (logxor temp (lsh temp 13)))
  (setq temp (logxor temp (lsh temp -17)))
  (setq seed (logxor temp (lsh temp 5)))
  (/ (float (abs seed)) 4294967296.0)
)

;; 使用示例
(defun rand-xor (a b var)
  (fix (+ a (* (xorshift32 var) (- b a -1))))
)
2. Park-Miller 生成器(最小标准)
比LCG更好的参数选择:
LISP
;; Park-Miller "最小标准" 生成器
(defun park-miller (var / temp)
  (setq seed (cond
               (seed)
               ((rem (abs (getvar var)) 2147483647))
             ))
  (setq temp (* seed 16807))
  (setq seed (rem temp 2147483647))
  (if (= seed 0) (setq seed 1))  ; 避免0值
  (/ (float seed) 2147483647.0)
)

(defun rand-pm (a b var)
  (fix (+ a (* (park-miller var) (- b a -1))))
)

3. 混合线性同余生成器
使用更好的参数组合:
LISP
;; 使用更优参数的LCG
(defun fast-lcg (var / x)
  (setq x 2147483647.0)  ; 2^31-1 (梅森素数)
  (setq seed (cond
               (seed)
               ((rem (abs (getvar var)) (fix x)))
             ))
  (setq seed (rem (* seed 48271) (fix x)))  ; 更好的乘数
  (/ (float seed) x)
)

(defun rand-fast (a b var)
  (fix (+ a (* (fast-lcg var) (- b a -1))))
)

4. 超轻量级随机生成器
如果您只需要简单的随机性:
LISP
;; 最简单的随机生成器 - 极速版本
(defun ultra-fast-random (var /)
  (setq seed (cond
               (seed)
               ((getvar var))
             ))
  (setq seed (rem (+ (* seed 1103515245) 12345) 4294967296))
  (/ (float (abs seed)) 4294967296.0)
)

(defun rand-ultra (a b var)
  (fix (+ a (* (ultra-fast-random var) (- b a -1))))
)

5. 性能对比表(AI分析的结论)
算法        速度        质量        周期        内存        推荐场景
原LCG        中等        一般        2^32        最少        兼容性要求高(lee-mac函数)
Xorshift32        最快        很好        2^32-1        最少        通用推荐
Park-Miller        快        好        2^31-2        最少        统计质量要求高
Fast-LCG        快        好        2^31-2        最少        平衡选择
Ultra-Fast        极快        够用        2^32        最少        大量生成


函数中的var是种子名,可以用以下
"MILLISECS"  ; 毫秒计时器(推荐,变化最快)
"DATE"       ; 当前日期时间
"CDATE"      ; 当前日期
"TDCREATE"   ; 图形创建时间

回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
AI胡写呢吧?getvar var来初始化种子,倒是要get哪个var啊?cdate?millisec?cputick?
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
kozmosovia 发表于 2025-8-9 21:08
AI胡写呢吧?getvar var来初始化种子,倒是要get哪个var啊?cdate?millisec?cputick?

var通常用"MILLISECS"
回复 支持 反对

使用道具 举报

发表于 昨天 13:28 | 显示全部楼层
本帖最后由 kozmosovia 于 2025-8-11 13:43 编辑

臆造函数logxor

评分

参与人数 1明经币 +1 收起 理由
tigcat + 1 很给力!

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:01 | 显示全部楼层

感谢指出,果然不靠谱。需要人工甄别,不过侧面反应人暂时不会被AI完全取代。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 09:29 , Processed in 0.172465 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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