技术论坛

一个简单的随机数生成器

作者 主题
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
主题:【分享】一个简单的随机数生成器
精华帖精华帖星级4级 推荐帖


只看楼主 只看精华 楼主 2020-03-03 12:41:48

有时候会要用到随机数,但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之间



 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1610273&b_id=50&s_id=0&num=20

至圣

经验值: 13022
发帖数: 1815
精华帖: 22
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 1楼 2020-03-03 12:58:48

不错,感谢分享!有些新推出的控制器有硬件伪随机数发生器RNG。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 12543
发帖数: 1843
精华帖: 0
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 2楼 2020-03-04 08:06:08


 感谢分享。


邮箱 yongquancun@126.com
以下网友喜欢您的帖子:

  
至圣

经验值: 23909
发帖数: 2059
精华帖: 78
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 3楼 2020-03-04 08:35:57

感谢分享!!!


网鱼能够改善伙食,还能释放工作中的压力。
以下网友喜欢您的帖子:

  
至圣

经验值: 16725
发帖数: 1309
精华帖: 2
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 4楼 2020-03-04 09:13:51



非常好
但是博图库有随机函数的块了


同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
以下网友喜欢您的帖子:

  
至圣

经验值: 16725
发帖数: 1309
精华帖: 2
回复:一个简单的随机数生成器


只看楼主 只看精华 5楼 2020-03-04 09:15:08

还是特别佩服大神


同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
以下网友喜欢您的帖子:

  
侠士

经验值: 1368
发帖数: 109
精华帖: 0
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 6楼 2020-03-04 09:16:14

感谢分享!!!


学无止境
以下网友喜欢您的帖子:

  
奇侠

经验值: 5059
发帖数: 335
精华帖: 6
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 7楼 2020-03-04 09:33:29

西家最新的网络课程中,有介绍博途的全局函数库《45分钟呢掌握博途扩展函数库》,可在全球资源库搜索LGF。LGF函数库目录如下:

数学运算的部分目录如下:

7项LGF_RandomBasic,在0.0~1.0之间产生随机数,其代码如下:(下载LGF后可根据代码自行修改增加功能)

#tempTimeStatus := RD_SYS_T(#tempTime);


//Callculate a random-start-value depending on the time

#tempRandomValue.%B3 := #tempTime.NANOSECOND.%B0;

#tempRandomValue.%B2 := #tempTime.NANOSECOND.%B1;

#tempRandomValue.%B1 := #tempTime.NANOSECOND.%B2;

#tempRandomValue.%B0 := #tempTime.NANOSECOND.%B3;


//Norm the calculated random number: 0.0 <= #LGF_RandomBasic <= 1.0

#LGF_RandomBasic := NORM_X(MIN := #MIN_UDINT, VALUE := #tempRandomValue, MAX := #MAX_UDINT);

其原理跟时间有相关。


应验了之前万版说的一句话,现在的1500更像一台计算机,借助博途的SCL语言,做线性同余也是很方便。

最近看了一篇大侠密匙验证的文章,有点启发,最近也在做相关的事。


我爱西家



仰望星空,脚踏实地
以下网友喜欢您的帖子:

  
至圣

经验值: 13022
发帖数: 1815
精华帖: 22
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 8楼 2020-03-04 10:27:33
以下是引用拾起在2020-03-04 09:33:29的发言 >7楼

西家最新的网络课程中,有介绍博途的全局函数库《45分钟呢掌握博途扩展函数库》,可在全球资源库搜索LGF。LGF函数库目录如下:

数学运算的部分目录如下:

7项LGF_RandomBasic,在0.0~1.0之间产生随机数,其代码如下:(下载LGF后可根据代码自行修改增加功能)

#tempTimeStatus := RD_SYS_T(#tempTime);


//Callculate a random-start-value depending on the time

#tempRandomValue.%B3 := #tempTime.NANOSECOND.%B0;

#tempRandomValue.%B2 := #tempTime.NANOSECOND.%B1;

#tempRandomValue.%B1 := #tempTime.NANOSECOND.%B2;

#tempRandomValue.%B0 := #tempTime.NANOSECOND.%B3;


//Norm the calculated random number: 0.0 <= #LGF_RandomBasic <= 1.0

#LGF_RandomBasic := NORM_X(MIN := #MIN_UDINT, VALUE := #tempRandomValue, MAX := #MAX_UDINT);

其原理跟时间有相关。


应验了之前万版说的一句话,现在的1500更像一台计算机,借助博途的SCL语言,做线性同余也是很方便。

最近看了一篇大侠密匙验证的文章,有点启发,最近也在做相关的事。


我爱西家


西家官方库的逻辑严密性和时序最优性肯定是最好的;手册标注的性能参数都是货真价实。



 
以下网友喜欢您的帖子:

  
至圣

经验值: 16187
发帖数: 6610
精华帖: 50
回复:一个简单的随机数生成器
推荐帖


只看楼主 只看精华 9楼 2020-03-04 12:22:08

楼主好分享!


知其道,用其妙!
以下网友喜欢您的帖子:

  
侠圣

经验值: 3707
发帖数: 556
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 10楼 2020-03-04 14:36:03


感谢楼主分享


 
以下网友喜欢您的帖子:

  
游民

经验值: 65
发帖数: 3
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 11楼 2020-03-04 21:57:19


感谢楼主分享


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 9622
发帖数: 432
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 12楼 2020-03-05 08:13:30


感谢楼主分享


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18938
发帖数: 2108
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 13楼 2020-03-09 11:32:18

大开眼界啊


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2237
发帖数: 208
精华帖: 2
回复:一个简单的随机数生成器


只看楼主 只看精华 14楼 2020-03-13 13:10:10

 

感谢分享,正好在找怎么弄随机数


 
以下网友喜欢您的帖子:

  
至圣

经验值: 72017
发帖数: 8045
精华帖: 145
回复:一个简单的随机数生成器


只看楼主 只看精华 15楼 2020-03-13 13:36:11

楼主经典应用了随机数种子与s7-1200/1500系统时钟精度的结合,用简单的方法处理这个“随”字,好,点赞!


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5867
发帖数: 347
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 17楼 2020-03-14 08:37:21

博途有API接口吗


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1255
发帖数: 86
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 18楼 2020-03-18 07:59:19

博涂已经有啦随机函数


一直被模仿,从未被超越
以下网友喜欢您的帖子:

  
侠士

经验值: 1491
发帖数: 112
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 19楼 2020-03-20 15:17:17


多谢分享,学习了


 
以下网友喜欢您的帖子:

  
游士

经验值: 203
发帖数: 6
精华帖: 0
回复:一个简单的随机数生成器


只看楼主 只看精华 20楼 2020-04-09 14:16:10


牛逼牛逼,学习学习


 
以下网友喜欢您的帖子:

  
收起
一个简单的随机数生成器
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。