电工学习网

 找回密码
 立即注册
查看: 5392|回复: 0
打印 上一主题 下一主题

一个简单的随机数生成器

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-4 10:15:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有时候会要用到随机数,但plc并没有随机数指令,网上搜了随机数算法,最常用的是线性同余法,Xn+1=(aXn+c) mod m,但是需要一个种子X0,这个种子最好也要随机,要不每次生成的序列都是一样的,一般取当前时间作为X0。既然是这样,我为啥不用当前时间作为我的随机数呢?之前的CPU,从200到400,其内部时钟分辨率都是ms,除非两次随机数间隔比较大,这个随机效果不好,但是到了1200/1500,其内部时钟的分辨率已经到了10的-10次方了,DTL类型的NANOSECOND域的范围是0~999999999,如果我只取其中的后面几位作为随机数,其效果应该还是很好的。
我做了下面的FC块,输入参数为随机数的上下限(range_hi和range_lo),输出一个包含上下限的随机数,原理就是读取当前时间到一个DTL的变量中,然后对DTL.NANOSECOND取(range_hi-  ruange_lo +1)的模。然后将余数加上range_lo。
一个简单的随机数生成器

然后自己做了一个测试程序,将产生的随机数保存到DB块的数组中,然后统计每个数字出现的次数
一个简单的随机数生成器

一个简单的随机数生成器

我是在plcsim上模拟测试的,在线后用python写了个脚本,每隔0.5+随机(0~0.5)秒对M0.0按一次CTRL+F2,使其接通,计算一次随机数,获取了11000个数据,然后统计了一下每个数出现的次数
一个简单的随机数生成器
出现次数最少80多,最多不到140,大多数落在了100到120之间
来源:西门子工业技术论坛

回复

使用道具 举报

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

本版积分规则

电工学习网 ( )

GMT+8, 2024-9-2 00:03

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

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