Dart中如何生成排除当前state值的随机数?
实现方案
前置说明
你当前使用的是Dart语言的随机数生成逻辑,要实现排除当前state值的需求,可按需选择以下两种实现方式:
方案1:循环重试法(实现最简单,适合绝大多数场景)
只要生成的新值和旧值相等,就重新生成,直到拿到不同的值即可,代码复杂度极低:
// 先保存当前的旧state值 int oldState = state; Random random = Random(); do { state = random.nextInt(range) + start; } while (state == oldState);
注意:该方案要求你的range值至少为2,否则会进入死循环,建议加前置判断避免异常。
方案2:固定步数计算法(无循环,性能稳定)
如果你的range很小,或者需要保证生成逻辑的耗时固定,可以用偏移计算的方式,完全避免循环:
核心逻辑是把要排除的值从取值范围里去掉后,先生成「范围长度-1」的随机数,再通过判断是否大于等于被排除值来决定是否加1偏移,就能拿到符合要求的结果:
int oldState = state; Random random = Random(); // 先把当前state转成相对于start的偏移量,方便计算 int excludeOffset = oldState - start; // 生成 range-1 范围内的随机数 int randOffset = random.nextInt(range - 1); // 如果生成的偏移量大于等于要排除的偏移量,就加1跳过排除值 if (randOffset >= excludeOffset) { randOffset += 1; } // 最终赋值新的state state = randOffset + start;
内容的提问来源于stack exchange,提问作者bjorke07
相关产品推荐
相关产品推荐

