You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Dart 如何从列表中获取两个不重复的随机元素(无需删除原列表元素)

两个零门槛实现方案(完全适配新手开发场景)

方案1:循环校验去重(改动量最小、逻辑最直白)

完全不需要修改原列表,只需要生成完第一个索引后,反复生成第二个索引直到和第一个不相等就行,几行改动就能解决问题:

var rnd = new Random();
int player1;
int player2;

void rndnbrs() {
  setState(() {
    player1 = rnd.nextInt(name.length);
    // 循环生成直到两个索引值不重复
    do {
      player2 = rnd.nextInt(name.length);
    } while (player2 == player1);
  });
}
  • 优势:全程不改动原name列表的内容和顺序,不会影响其他依赖这个列表的代码逻辑
  • 注意:只要列表长度大于等于2,这个循环永远会在1-2次判断内退出,不会有任何性能损耗,也不会出现死循环

方案2:列表打乱取前两位(代码最简洁)

Dart自带列表打乱的内置方法,完全不用自己写去重判断,也不用做删元素、插元素的冗余操作:

void rndnbrs() {
  setState(() {
    // 浅拷贝一份原列表再打乱,避免改动原列表的原有顺序
    final shuffledList = List.of(name)..shuffle(rnd);
    player1 = name.indexOf(shuffledList[0]);
    player2 = name.indexOf(shuffledList[1]);
  });
}

提示:你当前的name列表没有重复元素,用indexOf匹配原始列表的索引是完全准确的,不会出现匹配错值的问题。

关于你之前尝试的removeAt方案为什么行不通

删除元素生成新索引、再把元素插回原列表的逻辑很容易出bug:删除元素后列表长度变化、所有后续元素的索引会同步位移,很容易出现索引错位、元素插回位置不对的问题,完全没必要做这种容易出错的冗余操作。


内容的提问来源于stack exchange,提问作者Der Finn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 18:45:01