>백엔드 개발 >Golang >golang rand가 반복되지 않습니다

golang rand가 반복되지 않습니다

WBOY
WBOY원래의
2023-05-09 22:35:36917검색

난수는 프로그래밍에 자주 사용되며 Golang은 의사 난수를 생성하는 rand 패키지를 제공합니다. 그러나 어떤 경우에는 서로 다른 난수 세트를 생성해야 할 수도 있습니다. 이 목표를 달성하려면 실행 가능한 알고리즘을 고려해야 합니다.

이 기사에서는 반복되지 않는 난수를 생성하는 여러 가지 방법을 소개하고 Golang rand 패키지를 사용하여 반복되지 않는 난수를 생성하는 방법을 제공합니다.

방법 1: 셔플링 알고리즘

셔플링 알고리즘에서는 동일한 범위의 숫자 배열을 한 번 무작위로 배열합니다. 이 알고리즘의 시간 복잡도는 O(n)입니다. 이 방법의 단점은 이 알고리즘을 사용하여 많은 수의 난수를 생성할 때 시스템이 많은 메모리를 차지한다는 것입니다.

알고리즘은 다음과 같이 구현됩니다.

  1. 범위가 있는 숫자 배열을 생성합니다.
  2. 범위에 임의의 숫자를 생성하고 해당 숫자를 범위에 있는 다른 숫자로 바꿉니다.
  3. 원하는 고유 번호가 모두 생성될 때까지 2단계를 반복하세요.

방법 2: 기각 샘플링 알고리즘

기각 샘플링 알고리즘에서는 생성된 난수를 세트에 저장하고 다음 난수를 생성할 때 세트에 동일한 숫자가 이미 존재하는지 확인합니다. 있는 경우 난수를 다시 생성합니다. 이 알고리즘의 장점은 공간 효율적인 알고리즘이라는 것입니다. 그러나 이 알고리즘은 생성해야 하는 고유 숫자 수가 많을 때 시간이 더 많이 걸릴 수 있습니다.

알고리즘은 다음과 같이 구현됩니다.

  1. 숫자 범위, 대상 요소 수 및 결과 배열을 초기화합니다.
  2. 값 범위 내에서 난수를 생성하고 결과 배열에 난수를 추가합니다.
  3. 결과 배열에 포함된 숫자의 개수가 목표 개수보다 적으면 2단계를 반복하세요.

방법 3: 비트맵 알고리즘

비트맵 알고리즘에서는 각 비트가 범위에 있는 숫자의 존재 여부를 나타내는 비트맵을 만듭니다. 우리는 이 비트맵을 사용하여 우리가 생성한 난수 집합에 특정 숫자가 이미 존재하는지 여부를 추적합니다. 이 알고리즘의 장점은 상대적으로 시간 및 공간 효율적인 알고리즘이라는 것입니다.

알고리즘은 다음과 같이 구현됩니다.

  1. 숫자 범위, 대상 요소 수 및 결과 배열을 초기화합니다.
  2. 각 요소가 범위의 숫자를 나타내는 비트맵을 만듭니다.
  3. 무작위로 숫자를 생성하고 해당 숫자에 해당하는 비트맵 요소가 0인지 확인하세요. 0이면 해당 번호가 생성되지 않았음을 의미하고, 그렇지 않으면 해당 번호가 생성되었음을 의미합니다. 비트맵의 비트가 0인 경우 1로 설정합니다.
  4. 생성된 고유 번호를 결과 배열에 추가하세요. 결과 배열에 목표 숫자 수보다 적은 숫자가 포함되어 있으면 3단계를 반복하세요.

방법 4: Golang의 rand 패키지 구현

Golang은 의사 난수를 생성하는 데 사용할 수 있는 rand 패키지를 제공합니다. 이를 사용하여 반복되지 않는 난수를 생성할 수 있습니다.

알고리즘은 다음과 같이 구현됩니다.

  1. 숫자 범위와 목표 요소 수를 초기화합니다.
  2. Golang의 rand 패키지를 사용하여 난수를 생성하고 결과 배열의 첫 번째 요소를 저장하세요.
  3. 슬라이스의 숫자 범위에 숫자를 저장합니다.
  4. 슬라이스의 결과 배열에서 숫자를 찾아 삭제하세요. 이는 슬라이스의 인덱스 작업을 사용하여 달성할 수 있습니다.
  5. 결과 배열에 필요한 수의 숫자가 포함될 때까지 2단계와 4단계를 반복합니다.

위의 네 가지 방법을 사용하여 반복되지 않는 난수를 생성할 수 있습니다. 각 알고리즘에는 장점과 단점이 있습니다. 사용할 알고리즘은 필요에 따라 다릅니다. 중요도가 공간에 있는 경우 거부 샘플링 알고리즘을 사용하고, 시간이 지남에 따라 중요하다면 비트맵 알고리즘을 선택합니다. 그리고 Golang을 사용하는 경우 rand 패키지를 직접 사용하여 간단하고 직접적이며 효율적인 비반복 난수 생성 알고리즘을 구현할 수 있습니다.

위 내용은 golang rand가 반복되지 않습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.