[西门子] SCL编程实例100例-035-线性同余法生成随机数

[复制链接]
查看110 | 回复0 | 2024-12-11 08:07:27 | 显示全部楼层 |阅读模式
>

1 | 题目



线性同余方法(LCG)是一种产生伪随机数的方法。它是根据递归公式RandSeed = (RandSeed*A+C)%M进行求解计算的。线性同余法最重要的是定义了三个整数,乘数A、增量C和模数M,其中A、B、M是产生器设定的常数。LCG的周期最大为M,但大部分情况都会少于M。一般而言,LCG的M是2的指数次密(一般232或者264)。显然采用这种求余的方法更加增加了伪随机数的随机性。编写程序利用线性同余法生成10个随机数。



2 | 设计分析



读取PLC的系统时间作为原始种子,然后根据线性同余公式计算随机数。



3 | 创建功能或功能块



创建功能块FB,命名为“Random10NumsLC”。




4 | 定义接口变量



具体接口变量定义见下图:

分别定义常量#A、#B、#C对应线性同余法公式中的乘数A、增量C和模数M。M为数据类型UDInt的最大值,根据线性同余公式算出来的结果会落在0-M之间。



5 | 程序代码



编写程序代码。如下图:


检测到生成随机数的上升沿后根据线性同余法生成10个随机数,这10个随机数通过线性标准化和缩放后落在0-100之间,即生成0-100之间的10个随机数。



6 | 代码测试



在循环OB中调用FB-“Radom10NumsLC”,调用时会自动创建背景数据块,命名为“InstRadom10NumsLC”,该背景数据块可以用来监视和修改数据。转至在线并监控程序。如下图:

可以看到生成的10个随机数的随机性还是非常强的,注意这10个随机数是在一个扫描周期内完成的。



7 | 总结



学习IF条件语句;

学习WHILE循环语句;

学习上升沿的使用;

学习读取系统时间指令RD_SYS_T的使用方法;

学习线性标准化NORM_X的使用方法;

学习缩放SCALE_X的使用方法。

-

本帖子中包含更多资源

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

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

本版积分规则