为何<int>[]生成的随机数有重复,<int>{}生成的无重复?
问题原因说明
两段代码的随机数生成逻辑完全一致,结果不同的核心原因是你用了两种特性完全不同的Dart数据结构:
<int>[]创建的是List(列表)
List是有序结构,允许存储重复元素。它的add()方法不会做任何去重判断,不管你传的元素之前有没有存过,都会直接追加到列表尾部,每调用一次add,列表长度固定+1。
第一段代码的循环会刚好执行100次,每次生成的随机数哪怕和之前的数重复,也会被直接塞进列表,最后得到的100个元素自然有重复。final generatedRandoms = <int>[]; final rng = Random(); while (generatedRandoms.length < 100) { final gr = rng.nextInt(100) + 1; generatedRandoms.add(gr); }<int>{}创建的是Set(集合)
Set天生要求元素唯一,不允许重复值存在。它的add()方法会先检查你要加的元素是不是已经在集合里了:如果已经存在,这次add就不会生效,集合长度不会变;只有加的是之前没有的新元素,才会真正存进去,长度+1。
第二段代码的循环终止条件是集合长度到100,重复生成的随机数会被自动跳过,直到凑够100个不重复的数才会停,最后结果自然没有重复值。final generatedRandoms = <int>{}; final rng = Random(); while (generatedRandoms.length < 100) { final gr = rng.nextInt(100) + 1; generatedRandoms.add(gr); }
补充:你这里随机数生成范围是1~100的整数,刚好和要凑的元素数量相等,所以第二段代码跑出来的结果其实就是1到100所有数的随机乱序,不会缺数也不会重复。
内容的提问来源于stack exchange,提问作者Ulmer
相关产品推荐
相关产品推荐

