随机数:修订间差异

来自RustedWarfare Wiki
添加的内容 删除的内容
无编辑摘要
标签移动版编辑 移动版网页编辑 可视化编辑
无编辑摘要
标签移动版编辑 移动版网页编辑
 
(未显示同一用户的10个中间版本)
第1行: 第1行:
随机数
随机数

你要找的可能是不属于逻辑块,请看这里。
*[[概率与随机偏移]]


在逻辑中有这样一个函数返回一个伪随机数
在逻辑中有这样一个函数返回一个伪随机数
第11行: 第14行:
这里以1.15反编译代码作为讲解。
这里以1.15反编译代码作为讲解。


在rnd方法中有一个RandomIndex和bE值,bE与抛射体渲染有关,RandomIndex在解析单个ini文件时与每个rnd函数绑定且不同,以0开始自增
在rnd方法中有一个RandomIndex和bE值,bE与抛射体渲染有关,RandomIndex在解析单个ini文件时与每个rnd函数绑定且不同,以0开始自增。


这导致多个单位的rnd的RandomIndex相同,而生成相同的随机数。
这导致多个行动的rnd的RandomIndex相同,而生成相同的随机数。


它返回这样一个结果。
它返回这样一个结果。
第19行: 第22行:
a((int)min*1000,(int)max*1000,RandomIndex+unit.bE)*0.001f
a((int)min*1000,(int)max*1000,RandomIndex+unit.bE)*0.001f


你可以通过发射抛射体影响bE的值来改变引索,不过这对于多个单位作用不大。
你可以通过发射抛射体影响bE的值来改变引索,不过它的作用不大。


这是反编译代码。
这是反编译代码。
第73行: 第76行:
运算优先级存在bug,应该尽可能加上括号避免运算错误。
运算优先级存在bug,应该尽可能加上括号避免运算错误。


为保证生成质量,舍弃小数是个好的做法。
由于float数精度损失,这个随机生成器的有效范围是16777215,考虑到游戏滥用id,id可能超出有效范围。

int(rnd(self.id*0.001,1/0))

生成区间0~2147483

不过这依然面临多行动生成相同,这意味着你需要更小的生成区间,以便分配给多个行动。

这个随机生成器的有效范围是16777215,考虑到游戏滥用id,id可能超出有效范围。

这时应该使用[https://cra.lanzouj.com/b0agtlmih rnd组件] 下载密码:00

如果你需要准确的小数,生成区间在-16777.217~16777.216内保证精度,这里舍弃负数。


rnd(self.id*0.001,16777.216)%mod+min
这时应该使用[https://cra.lanzouj.com/b0agtlmih rnd]组件


不过该生成式的随机分配不均,导致有效范围更小。
下载密码:00

2023年11月11日 (六) 09:32的最新版本

随机数

你要找的可能是不属于逻辑块,请看这里。

在逻辑中有这样一个函数返回一个伪随机数

rnd(float min,float max) float

不过该函数存在相同帧生成相同的问题,本章将详细讲解如何避免它。

为了避免它,你可能使用些时钟等方式来生成随机数,不过这些方案往往不够随机。

这里以1.15反编译代码作为讲解。

在rnd方法中有一个RandomIndex和bE值,bE与抛射体渲染有关,RandomIndex在解析单个ini文件时与每个rnd函数绑定且不同,以0开始自增。

这导致多个行动的rnd的RandomIndex相同,而生成相同的随机数。

它返回这样一个结果。

a((int)min*1000,(int)max*1000,RandomIndex+unit.bE)*0.001f

你可以通过发射抛射体影响bE的值来改变引索,不过它的作用不大。

这是反编译代码。

    public static final int a(int i, int i2, int i3) {

        k t = k.t();

        if (i < i2) {

            int i4 = i2 - i;

            int i5 = (((t.bu % 10) + (1313131313 * t.bu)) + (((t.bG + ((133333333 * i3) * i4)) + (i3 * 13131313)) + ((t.bu * 13131313) * i3))) % i4;

            if (i5 < 0) {

                i5 = -i5;

            }

            i5 += i;

            if (i5 < i || i5 > i2) {

                k.b("notRandInt number not in range: " + i5 + " min:" + i + " max:" + i2);

            }

            return i5;

        } else if (i <= i2) {

            return i;

        } else {

            k.b("min>max");

            return i;

        }

    }

其中tu是游戏帧,bG是动态变化的种子。

由此可见改变i4也就是最大与最小值的差,来影响随机生成结果的开销最小。

这里可以使用self.id作为偏移。

rnd(self.id*0.001,1/0)%mod+min

运算优先级存在bug,应该尽可能加上括号避免运算错误。

为保证生成质量,舍弃小数是个好的做法。

int(rnd(self.id*0.001,1/0))

生成区间0~2147483

不过这依然面临多行动生成相同,这意味着你需要更小的生成区间,以便分配给多个行动。

这个随机生成器的有效范围是16777215,考虑到游戏滥用id,id可能超出有效范围。

这时应该使用rnd组件 下载密码:00

如果你需要准确的小数,生成区间在-16777.217~16777.216内保证精度,这里舍弃负数。

rnd(self.id*0.001,16777.216)%mod+min

不过该生成式的随机分配不均,导致有效范围更小。