카드를 씻으면

7540 단어 shuffleRuby
🚨주의🚨
다음은 루비 입문 다음 날의 문외한이 코드를 쓰고 있다.

문제.


n달러짜리 카드1부터 n까지 카드를 세탁해 주세요.

해답 예시

  • shuffle 사용 방법
    cards = [*1..n]
    cards.shuffle
    p cards 
    
  • rand에서 해요sort
    cards = [*1..n]
    cards.sort_by!{rand}
    p cards
    
  • 등장하는 숫자가 독특해지기 전rand 계속 휘둘러라
  • cards = Set.new
    loop do
      cards << rand(max)
      if cards.size >= n
        p cards
        break
      end
    end
    

  • 사용fisher-yates의 혼란 알고리즘
    Fisher – Yates shuffle은 제한된 집합에서 무작위 배열을 생성하는 알고리즘입니다.이 방법은 유한열을 무작위의 다른 (흐트러진) 순서의 유한열로 다시 배열하는 것이다.
    cards = [*1..n]
    len = cards.length - 1
    c = 0
    len.step(1, -1) do |i|
      r = rand(i)
      c += 1
      cards[i], cards[r] = cards[r], cards[i]
    end
    p cards
    
  • 현실 세계에서 카드를 뽑는 동작을 고려하여 그렇게 절차를 만든다.
  • cards = [*1..n]
    shuffled = []
    n.times do
      idx = rand(cards.length)
      shuffled << cards[idx]
      cards.delete_at(idx)
    end
    p cards
    
  • 카드 세탁 결과 $그렇기 때문에 사전식으로 배열할 때의 색인을 찾아서 흐트러뜨린다.

  • 한 번만 사용하는 게 좋아요rand
  • def factorial(number)
      number = 0 if number.nil?
      (1..number).inject(1,:*)
    end
    
    cards = [*1..n]
    shuffled = []
    r = rand(factorial(n))
    (n-1).downto(1) do |i|
      quotient = r/factorial(i)
      excess = r%factorial(i)
      shuffled << cards.delete_at(quotient)
      r = excess
    end
    p shuffled
    

    좋은 웹페이지 즐겨찾기