newtype
::: newtype의 지식창고 :::
newtype
전체 방문자
오늘
어제
  • 분류 전체보기 (392)
    • Dev (214)
      • C, C++ (43)
      • Go (5)
      • Web (49)
      • DBMS (21)
      • DevOps (8)
      • Java (2)
      • Windows, Win32 (4)
      • Visual Basic (5)
      • C# (2)
      • Mobile (25)
      • SQL CE (7)
      • Google Map (6)
      • Python (2)
      • cygwin (2)
      • 기타 (32)
      • Ruby (1)
    • 명언 (10)
    • 모임 (18)
      • 붕주회 (3)
      • 신흥컴정 (14)
      • 웹20기 (1)
    • 사진 (8)
    • 불펌 (29)
    • 막글 (98)
    • 게임 (6)
    • 여행 (8)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

  • whoami
05-13 00:00
hELLO · Designed By 정상우.
newtype

::: newtype의 지식창고 :::

Dev/Go

go 에서 time 없는 난수 발생

2022. 9. 19. 15:55

목적

  • 랜덤 대진표를 만드려고 한다. local 환경에서 만드는 경우는 난수 생성시 seed 값을 time을 사용하는데, go playground 에서 실행해보니 항상 같은 값이 나왔다. 아마도 go-playground가 일종의 vm 이라서 최초 생성시 동일한 시간으로 생성되는것으로 추정된다. go-playground 에서도 랜덤하게 생성되도록 구현해보자.

방법

  • 아래 예제에서는 crypto로 값을 seed를 초기화 하고 있다(init 함수).
  • go-playground 에서도 Run 버튼 옆에 "Go dev branch"를 선택해야 정상 동작한다.
package main

import (
    cryptoRand "crypto/rand"
    "encoding/binary"
    "fmt"
    mathRand "math/rand"
)

func init() {
    var b [8]byte
    _, err := cryptoRand.Read(b[:])
    if err != nil {
        panic("cannot seed math/rand package with cryptographically secure random number generator")
    }
    mathRand.Seed(int64(binary.LittleEndian.Uint64(b[:])))
}

func shuffle(list []string) []string {
    result := make([]string, len(list))
    copy(result, list)

    //math_rand.Seed(time.Now().UnixNano())  // vm 이라 seed가 시간이 같은듯.
    mathRand.Shuffle(len(result), func(i, j int) { result[i], result[j] = result[j], result[i] })
    return result
}

func main() {

    // 랜덤 대진표 생성
    list := []string{"Lee", "Woo", "Ju", "Chul", "Kim"}

    result := map[string]int{}

    for _, p1 := range shuffle(list) {
        for _, p2 := range shuffle(list) {
            play := ""
            if p1 > p2 {
                play = fmt.Sprintf("%s:%s", p1, p2)
            } else if p1 < p2 {
                play = fmt.Sprintf("%s:%s", p2, p1)
            }

            if len(play) > 0 {
                result[play] = 0
            }
        }
    }

    // 결과 출력
    for k, _ := range result {
        fmt.Println(k)
    }
}

참고

  • https://stackoverflow.com/questions/12321133/how-to-properly-seed-random-number-generator
반응형
저작자표시

'Dev > Go' 카테고리의 다른 글

AI와 채팅  (0) 2022.12.02
Oracle 에서 MariaDB로 데이터 마이그레이션  (0) 2022.10.13
Cobra로 Command 입력  (0) 2022.10.11
Golang으로 Synology 연동 Telegram 봇 만들기  (1) 2020.03.15
    'Dev/Go' 카테고리의 다른 글
    • AI와 채팅
    • Oracle 에서 MariaDB로 데이터 마이그레이션
    • Cobra로 Command 입력
    • Golang으로 Synology 연동 Telegram 봇 만들기
    newtype
    newtype
    지극히 개인적인 지식의 창고

    티스토리툴바