找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5749|回复: 4

[教程源码] 解决多个模拟器同步启动后随机结果一样的问题

[复制链接]
  • 打卡等级:行侠仗义

1080

主题

2100

回帖

4280

积分

院长

鲜花
6
猫粮
7390
QQ
发表于 2020-1-12 00:18:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
大家在用模拟器同步器启动脚本的时候, 会发现每个模拟器的随机数结果是一样的, 比如5个模拟器随机结果顺序都是5, 2, 3, 2之类的.

这是因为按键精灵的Randomize() 命令默认值为当前系统秒数, 也就是在同一秒内不管启动运行多少次, 结果是完全一样的.

这里提供3种解决方法.

第一种, 使用紫猫插件的随机数功能, 紫猫插件的初始化随机数种子默认值是毫秒级的时间, 能解决大部分同步器的问题, 如果本方法无效, 请看第二个方法

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件, 内含执行zm.RndInitSeed()初始化随机种子功能, 所以不需要初始化随机种子了

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100



第二种, 如果上面这种方法失败了, 那说明你电脑太优秀了, 所有脚本是在1毫秒内启动的, 那这种情况只能人为的改变初始种子了, 也就是每一个脚本给不同的初始随机数种子, 具体例子见下面代码, 如果你会写界面的话, 可以把初始化种子的10,20,30这部分加法数字放到界面配置上, 其他数字也可以, 反正保证每个模拟器的初始化种子值不一样就行, 这种是最推荐的方法.

[按键精灵] 纯文本查看 复制代码
//第1个模拟器脚本
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件
zm.RndInitSeed Time() + 10 //初始化第1个模拟器的随机种子, 只要执行一次就够了, 千万不要循环执行多次!

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100

[按键精灵] 纯文本查看 复制代码
//第2个模拟器脚本
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件
zm.RndInitSeed Time() + 20 //初始化第2个模拟器的随机种子, 只要执行一次就够了, 千万不要循环执行多次!

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100

[按键精灵] 纯文本查看 复制代码
//第3个模拟器脚本
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件
zm.RndInitSeed Time() + 30 //初始化第3个模拟器的随机种子, 只要执行一次就够了, 千万不要循环执行多次!

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100


如果你不想每个脚本单独配置, 第一种方法又无效, 那这里再提供一种不太靠谱的方法三.
依靠网络数据提供初始种子, 但是缺点是, 无法保证该网站每次都能成功返回数值, 毕竟是国外的站点.
补充提醒下, 该网站获取随机次数有限额, 大约一天1000次吧? 具体忘了, 所以该方法不是很稳定, 但是可以提供思路, 你们也可以自己找找有没有其他类似的网站
[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件
//获取网络数据初始化随机种子值, 警告, 有时候会出现获取失败导致结果异常!
//只要执行一次zm.RndInitSeed()就够了, 千万不要循环执行多次!
zm.RndInitSeed CLng(Url.Get("https://www.random.org/integers/?num=1&min=1&max=99999999&col=1&base=10&format=plain&rnd=new"))

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100

楼主热帖

4

主题

12

回帖

16

积分

学前班

鲜花
0
猫粮
137
发表于 2020-9-14 10:33:20 | 显示全部楼层
紫猫老师,我用的是你第二种方法,很多时候还是随机数结果一样,有其它有效的办法吗?
  • 打卡等级:行侠仗义

1080

主题

2100

回帖

4280

积分

院长

鲜花
6
猫粮
7390
QQ
 楼主| 发表于 2020-9-14 11:59:53 | 显示全部楼层
枫无痕叶无声 发表于 2020-9-14 10:33
紫猫老师,我用的是你第二种方法,很多时候还是随机数结果一样,有其它有效的办法吗? ...

方法二只要你确认每个脚本的初始化种子值不一样, 那么百分百不会出现相同序列, 除非你自己弄成了一样的种子值

4

主题

12

回帖

16

积分

学前班

鲜花
0
猫粮
137
发表于 2020-9-14 20:55:29 | 显示全部楼层
紫猫 发表于 2020-9-14 11:59
方法二只要你确认每个脚本的初始化种子值不一样, 那么百分百不会出现相同序列, 除非你自己弄成了一样的种 ...

我复制的模板代码,脚本设置的延迟启动,分别是50,100,150···这些代替的你模板上的第几个模拟器:
//第1个模拟器脚本
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件
zm.RndInitSeed Time() + 1 //初始化第1个模拟器的随机种子, 只要执行一次就够了, 千万不要循环执行多次!

//这里注意, 千万不要加自带的Randomize()命令!!!!
//直接用紫猫插件里的随机功能, 不管是随机数字还是随机姓名都可以
TracePrint zm.RndNum(100, 10) //随机10到100
  • 打卡等级:无名新人

0

主题

108

回帖

108

积分

小学生

鲜花
0
猫粮
575
发表于 2020-12-8 20:52:48 | 显示全部楼层
        很给力!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-3-28 21:58

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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