sort_by { rand }

Tags:

http://www.rubyquiz.com/quiz113.html

루비에서 실수 하기 쉬운점.

임의의 리스트를 shuffle할 때, 다음과 같이 하면 안된다.

list.sort { rand }

같은 코드를 여러번 호출해도 shuffle이 한번 된 뒤로는 변경이 안됨!!!

반드시 sort_by를 써서 다음과 같이.

list.sort_by { rand }

Comments

2 responses to “sort_by { rand }”

  1. Sam Kong Avatar
    Sam Kong

    꽤 흥미로운 지적이네요.
    사실 list.sort에 블럭을 넘겨줄 땐 두 개의 원소를 비교해서 그 결과가 음수인지 양수인지로 판단해야 하는데 rand는 항상 양수만을 리턴해서 발생하는 결과인 것 같습니다.

    이렇게 하면 원하는 결과를 얻을 수 있을 것 같아요.

    list.sort { rand – 0.5 }

    물론 원칙적으로는 list.sort_by { rand }를 써야겠지만요.

    그런데 리스트의 사이즈가 클 때는 위의 방법도 꽤 bias가 생길 겁니다.
    과학적 분석을 해본 것은 아니지만 사이즈가 클 경우엔 list.sort_by { [rand, rand] }와 같은 방법을 고려해 보는 것도 bias를 줄이는 데 도움이 될 것 같은 생각이 드네요.

    Sam

  2. MKSeo Avatar
    MKSeo

    예전에 본 책에서 rand 함수가 bias가 있다면 rand1,rand2,rand3,…,randN 을 만들고 각각의 rand(N-1)을 randN의 seed로 쓰는 방법을 본 적이 있습니다.

    즉,randN(randN-1(…(rand3(rand2(rand1)))…)) 이런식으로요.

    말씀하신 방법은 rand가 어떤 주기를 가지고 난수를 발생시키고 있다고 할 때(예를들어, 1, 3, 2, 1, 3, 2, 1, 3, 2의 경우 주기=3) 그런 반복 주기만 좀 늘어나게 하지 않을까라는 생각이 듭니다.

    물론 pseudo random number로 random number를 흉내내려고 하는자는 죄를 범하는 거라고 폰노이만이 그랬죠;;;;;;;

Leave a Reply

Your email address will not be published. Required fields are marked *