Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dart中的嵌套循环和内存不足_Dart_Random_Out Of Memory - Fatal编程技术网

dart中的嵌套循环和内存不足

dart中的嵌套循环和内存不足,dart,random,out-of-memory,Dart,Random,Out Of Memory,我尝试在嵌套for循环中使用重复数据消除代码制作一个简单的随机数生成器程序。 但当我试图在dartpad或android studio上运行此代码时,有两三次都有效,之后,我收到了“内存不足”的消息。我的密码有问题吗 import 'dart:math'; void main() { final myNum = <int>[]; final random = Random(); int num; for (int i = 0; i < 6; i++) {

我尝试在嵌套for循环中使用重复数据消除代码制作一个简单的随机数生成器程序。 但当我试图在dartpad或android studio上运行此代码时,有两三次都有效,之后,我收到了“内存不足”的消息。我的密码有问题吗

import 'dart:math';

void main() {
  final myNum = <int>[];
  final random = Random();
  int num;

  for (int i = 0; i < 6; i++) {
    num = random.nextInt(45) + 1;
    myNum.add(num);

    for (int j = 0; j < i; j++) {
      if (myNum[i] == myNum[j]) {
        i--;
        break;
      }
    }
  }

  print(myNum);
}
import'dart:math';
void main(){
最终粘菌数=[];
最终随机=随机();
int-num;
对于(int i=0;i<6;i++){
num=random.nextInt(45)+1;
添加(num);
对于(int j=0;j
原因是DartPad仅在没有更多工作要做(例如,等待异步或程序完成)时才首先显示输出

在您的例子中,您的程序包含一个无限循环,因此程序将无休止地运行,不断向列表中添加元素,直到内存耗尽。如果您在程序中添加一些额外的日志记录,并在DartVM中运行它,则可以看到这一点。DartVM会在程序运行时打印

您可以在此处找到问题:

    for(int j=0; j<i; j++){
      if(myNum[i]==myNum[j]){
        i--;
        break;
      }
    }
它只是继续将元素添加到现有的值列表中。因此,您的程序运行良好,直到
如果(myNum[i]==myNum[j])
为真,这将随机发生(并且很多时间不会发生,这就是为什么您的程序看起来通常是良好的)

您应该向逻辑中添加一个
myNum.removeLast()
,如下所示:

    for (int j = 0; j < i; j++) {
      if (myNum[i] == myNum[j]) {
        i--;
        myNum.removeLast();
        break;
      }
    }
更短的解决方案

如果您希望最小化代码并获得稳定的执行时间,还可以执行以下操作:

import 'dart:math';

void main() {
  final myNum = <int>{};
  final random = Random();

  while (myNum.length != 6) {
    myNum.add(random.nextInt(45) + 1);
  }

  print(myNum.toList()); // [2, 23, 40, 35, 39, 22]
}
void main() {
  print((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6)); // [6, 41, 12, 2, 11, 42]
}

我真的很感激你的回答@julemand101刚刚注意到了这一点,最后一个示例生成45个元素,然后创建一个子列表。你的
set
变量答案会比这个更好,对吗?你说的内存使用率更高是对的,但执行时间更一致。此外,如果您想生成多于6个数字,则
集合
解决方案的速度会减慢,因为获得我们已经找到的数字的可能性更高。如果您最终想要45个数字,
Set
解决方案将非常缓慢且效率低下。相反,
List
解决方案只是生成一个包含我们想要的所有数字的列表,将该列表洗牌,然后从该列表中获取一个新列表。如果您想生成大量随机数列表,您甚至可以创建一次大列表并重用它(每次使用前只需重新洗牌)。是的,正如您所说,在循环中使用
shuffle
方法比
random.nextInt
快得多。
void main() {
  print((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6)); // [6, 41, 12, 2, 11, 42]
}