西门子Protal_TIA SCL编程实例_伪随机数_线性同余法LCG
文章参考1:PLC产生随机数
文档参考2:西门子S7 -300线性同余法产生随机数
编写日期:2022年3月27日 11:27 周日
递归公式:RandSeed = (A * RandSeed + B) % M
A:乘数
B:增量
M:模数
LCG的周期最大为M,但大部分情况下都会少与M
要另LCG达到最大周期,应符合以下条件:
B,M互质;
M的所有质因数都能整除A-1;
若M是4的倍数,A-1也是;
A,B,N[0]都比M小;
A,B都是正整数;
FUNCTION "RandomLCG" : UInt TITLE = RandomLCG { S7_Optimized_Access := 'TRUE' } AUTHOR : bootloader VERSION : 0.1 //随机数_线性同余法LCG VAR_INPUT wMax : Int; // 随机数上限(不包含) END_VAR VAR_TEMP DTL {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // 取得的系统时间 RET_V : Int; // 指令返回结果_取系统时间 seed : UDInt; // 种子 randseed : Real; END_VAR BEGIN //PLC产生随机数_线性同余法 //方法来自西门子技术论坛:https://wenku.baidu.com/view/8db9e41d82eb6294dd88d0d233d4b14e84243e2b.html //R(n+1) = [R(n) * a + b] mod c // //作者:bootloader //2022年3月27日 19:29 周日 //--取得种子------------------- #RET_V := RD_SYS_T(#DTL); //获取系统时间 #seed := #DTL.MINUTE + #DTL.SECOND + #DTL.NANOSECOND; //----------------------------- #seed := (#seed * 25173 + 13849) MOD 65536; #randseed := UDINT_TO_REAL(#seed) / 65535.0; //----------------------------- #RandomLCG := REAL_TO_UINT(#randseed * INT_TO_REAL(#wMax)); END_FUNCTION
__EOF__
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
2018-03-27 勿在浮沙筑高台
2018-03-27 Anaconda使用