LotusScript生成随机语言值时变量偶发空值的问题排查
LotusScript 随机取值偶发返回空值的成因
偶发空值是两个问题叠加导致的:
- 偶发数组下标越界
LotusScript中Rnd()设计返回范围为[0, 1)的单精度浮点数,但单精度浮点数存在固有存储精度误差,运算过程中可能因精度偏移,让Rnd() * UBound(arr_language)的计算结果短暂超过10的边界值。此时Round(数值, 0)的四舍五入逻辑会将这类偏差值向上取整到11,而代码定义的数组仅覆盖下标0到10,访问未定义的下标位置时,LotusScript不会主动抛出运行时错误,仅返回空字符串,这是空值产生的直接原因。 - 取整逻辑放大越界概率
Round()的四舍五入规则本身就会在接近整数边界的数值上产生舍入偏移,搭配带精度误差的浮点随机数时,越界命中的频率会进一步升高。如果未在随机数生成前调用Randomize语句初始化随机种子,Rnd()会使用固定的随机数序列,更容易稳定命中边界处的误差值,让空值问题偶发出现。
正确实现
使用Int()向下取整逻辑,从根本上保证生成的下标完全落在数组合法范围内:
' 初始化随机数种子,避免使用固定随机序列 Randomize Dim arr_language(0 To 10) As String arr_language(0) = "English" arr_language(1) = "Spanish" arr_language(2) = "Chinese" arr_language(3) = "German" arr_language(4) = "Dutch" arr_language(5) = "Swedish" arr_language(6) = "French" arr_language(7) = "Danish" arr_language(8) = "Italian" arr_language(9) = "Polish" arr_language(10) = "Portugese" Dim language As String ' Int()取不大于当前值的最大整数,生成的下标范围为0-10,完全匹配数组边界 language = arr_language( Int( Rnd() * (UBound(arr_language) + 1) ) )
内容的提问来源于stack exchange,提问作者Malin
相关产品推荐
相关产品推荐

