跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
帮助
RustedWarfare Wiki
搜索
搜索
创建账号
登录
个人工具
创建账号
登录
查看“随机数”的源代码
页面
讨论
大陆简体
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
链接
RustedWiki QQ群
←
随机数
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
随机数 你要找的可能是不属于逻辑块,请看这里。 *[[概率与随机偏移]] 在逻辑中有这样一个函数返回一个伪随机数 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,mod)+min 者是最小精度选择,选择这个不是最好的,若要使分布更加均匀请改善倍率,如0.002。 运算优先级存在bug,应该尽可能加上括号避免运算错误。 为保证生成质量,舍弃小数是个好的做法。 int(rnd(self.id*0.001,1/0)) 生成区间0~2147483 当多次行动生成时,对于多个单位,你需要格外的引索,这很容易造成冲突,建议使用rnd组件。 如果你需要准确的小数位,请限制区间在-16777.217~16777.216,避免float精度损失。 这个随机生成器的有效范围是16777215,考虑到游戏滥用id,id可能超出有效范围。 这时应该使用[https://cra.lanzouj.com/b0agtlmih rnd组件] 下载密码:00
返回
随机数
。
开关有限宽度模式