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