【算法分享】如何用纯事件进行开方。
rpgmakermv吧
全部回复
仅看楼主
level 5
之前有人问到RM没有开方功能,虽然我觉得这个功能没有也无所谓,但偶尔可能还是会用到的。再加上我也挺感兴趣,那就设计一个用纯事件开方的算法吧。虽然我知道这方法肯定有前人做过,不过是以自己的方法重现一下而已。
首先根据扔鸡蛋模型,要想知道哪一层扔的鸡蛋会碎,就要一层层去试。要想知道Y是哪个X的平方,就将X代入1,2,3,4....不停相乘直到找到那个数就可以了。这是理论基础。
这时候就会有小朋友问了,你这X代入的都是整数,怎么能准确找到呢!
RM是没有小数的啊哈哈哈。RM的变量输入上限是99999999,那么求根的话只需要试10000次就够了,就这样我们获得了一个算法雏形——
而且这么简单的数数算法电脑也能一瞬间算出来,人类的科技真是伟大。
但肯定有人觉得这方法不是蠢到爆炸,要是我做ACT时一直并行处理的话不卡得要死!
没错,接下来就是重点,既算法的优化。使用二分法的话,因为99999999小于2的二十七次方,即可保证最多只需要进行27次循环就能求得其整数根。
不过RM虽然输入只能8位,但其实输出变量理论可以到达255位,有需要你可以根据自己的变量上限进行调整,这里只用八位数作说明示范。
2020年05月18日 23点05分 1
level 5
原理很简单,先从2的14次方16384开始求根,如果高于2048的平方,则将根值上升到【2的11次方加2的10次方】,否则降至【2的11次方减2的10次方】。每一次增减的值都是上一个增加值的一半,如此循环到2的0次方,即1的时候,就是最近似的整数解了。
之所以使用2的平方数列而不是10000/2是因为RM的计算结果会忽略小数点,所以整除最好。
这样一来,优化算法就完成了。当然在现代电脑强大的算力面前几乎没有区别。
这时候又有人会问,我真的想要求小数怎么办,你给我精确到小数点后一位行不行。当然可以,虽然RM不能显示小数,但值还是能求出来的,但是前提是你一开始用来求根的值要在一开始乘以一百,即10的二次方。同理要精确到小数点后两位需要乘以一万,三位要乘以一百万。在设置一开始求根的值时也要加上精确位数数量的零。
看明白之后,设计开三次方以上的逻辑只不过这循环多乘几次根而已。
那么这次的纯事件算法分享就到这里结束了。
2020年05月18日 23点05分 2
level 12
感谢分享[茶杯]
2020年05月19日 13点05分 3
level 7
不能说蠢到爆炸,只能说不熟悉而已。试试事件->变量->代入选择脚本
Math.sqrt(100)
当然这100可以换成5号变量的值比如
Math.sqrt($gameVariables.value(5))
2020年05月19日 23点05分 4
只是分享个算法构思而已,主要还是原理讲解,明白这种逻辑的话就算身边没有科学计算器也可以用较少的步数笔算开三次方。
2020年05月20日 05点05分
@我推の狗子 Math.pow(9, 1/3); 😉
2020年05月20日 11点05分
level 7
我仿佛回到去年学c语言的时候了
2020年05月20日 13点05分 5
1