진즉에 만들 것을..
그다지 수학적이진 않지만 배열을 뒤섞되, 위치의 가중치를 적용한 것이다. 즉 배열의 앞에 있는 애들은 앞에 있을 확률이 높고, 뒤에 있는 애들은 뒤에 있을 확률이 높다.
def w_shuffle(arr):
l = len(arr)
w = map(lambda x: (x + 1) * random.randrange(10, 1000), range(l))
# w = map(lambda x: (x + 1) * abs(random.gauss(0, 1)), range(l))
re_arr = map(lambda x: (x[0], x[1]), zip(arr, list(w)))
result = sorted(list(re_arr), key=lambda x: x[1])
return list(map(lambda x: x[0], result))
여기서 10, 1000을 조정해가며 쓰면 된다. 예를 들어 100개짜리 배열에서 1000을 쓰면 뒤에 있는 놈도 앞으로 올 확률이 높다. 10000을 쓰면 앞으로 올 확률이 더욱 높다.
가우시안 랜덤을 넣는 것도 방법이다. 정규분포를 이렇게 저렇게 적용해 볼 수 있다. 절대값을 취했으므로 표준정규분포보다 급격한 커브가 될 것 같은데... 헷갈리네..
가중치 배열 셔플은 다른 구현 방법도 많다. 퀵소트처럼 찍고 좌우로 재귀해가며 뒤섞는 방법도 보인다. 그런 방법은 추가 소팅은 필요없는 장점이 있지만 복잡하다.