Set , While 무한루프 오류

pharmDev·2024년 10월 30일
post-thumbnail

문제상황

랜덤 숫자 생성 어플 실습 중에 "생성하기"버튼을 눌러도 숫자가 생성되지 않는 문제가 발생함

코드목표

  • 1000이하의 랜덤한 정수를 만든다
  • 생성한 램덤 정수는 중복되지 않게 리스트에 보관한다.
  • Set한수와 .tolist()를 이용해서 중복되지 않게 리스트List로 보관한다.
  • While 함수를 이용해서 Set 에 3개의 숫자만 담기도록 한다.

작성한 코드 (문제가 있는 코드)

_Footer(
                  onPressed: () {
                    final rand = Random();
                    final Set<int> newNumbers = {};


                    final randomNumber = rand.nextInt(1000);

                    while(newNumbers.length<3){
                      newNumbers.add(randomNumber);
                    }

                    setState(() {
                      numbers = newNumbers.toList();
                    });
                  },
                ),
  • 여기서 while 함수 바디에 newNumbers.add를 이용해서 randomNumber 함수를 통해 만들어진 난수를 Set에 추가한다.
  • 그러나 randomNumber함수는 while 함수 바디 외부에 있기 때문에, 생성하기 버튼을 눌렀을 때, 한개의 난수가 만들어지고 randomNumber에 저장된다.
  • While 함수는 newNumbers라는 Set속에 있는 난수가 3개가 될 때까지 가동되는데, randomNumber는 rand 함수가 한번 호출되어 만든 난수 1개만 지니고 있다.
  • Set은 중복된 수를 추가할 수 없으니, 계속 randomNumber가 가진 한개의 난수만 Set에 추가된다.
  • 전체 Set를 구성하는 난수의 갯수가 3개가 될 수 없으므로 While함수가 계속 실행되는 무한루프가 돌게되는 것이다.

해결 코드


onPressed: () {
  final rand = Random();
  final Set<int> newNumbers = {};

  // Set에 3개의 랜덤 숫자가 추가될 때까지 반복
  while (newNumbers.length < 3) {
    final randomNumber = rand.nextInt(1000); // 이 부분을 반복문 안으로 이동
    newNumbers.add(randomNumber); // 각 랜덤 숫자를 Set에 추가
  }

  setState(() {
    numbers = newNumbers.toList();
  });
},
  • while 함수가 되는 동안 randomNumber도 반복 실행되어 새로운 난수를 생성하도록 한다. → randomNumber를 while 함수 바디 내부로 이동한다.

  • 그러면 새로운 난수가 나올 때 마다 Set에 저장하여 중복없이 3개의 난수가 저장되고 while은 멈추고 다음 코드가 진행된다.

반성 및 푸념

나는 왜 final randomNumber = rand.nextInt(1000)을 적어놓으면 여러번 반복되어 생성될거라 생각했나.
버튼을 누르면 build가 재실행되니까 rand도 재실행 될거라고 생각했다.
이는 매우 문제적인 생각이다.
위의 오류 코드인 상태에서 버튼을 누르면 build가 재실행되다가 말아버리는 것이다. while 함수에서 진행되지 않는것이다.

profile
코딩을 배우는 초보

0개의 댓글