# 윈도 프리셀(Freecell) 게임의 카드 섞기 알고리즘

> Clean Markdown view of GeekNews topic #17421. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17421](https://news.hada.io/topic?id=17421)
- GeekNews Markdown: [https://news.hada.io/topic/17421.md](https://news.hada.io/topic/17421.md)
- Type: news
- Author: [regentag](https://news.hada.io/@regentag)
- Published: 2024-10-25T14:29:38+09:00
- Updated: 2024-10-25T14:29:38+09:00
- Original source: [solitairelaboratory.com](http://solitairelaboratory.com/mshuffle.txt)
- Points: 12
- Comments: 8

## Summary

윈도 프리셀 게임의 카드 섞기 알고리즘은 특정 번호를 입력하면 동일한 카드 배열을 생성할 수 있도록 설계되어 있으며, 이는 다른 프리셀 프로그램에서도 활용됩니다. 이 알고리즘은 간단한 C 코드로 구현되어 있으며, MS 컴파일러의 rand()와 srand() 함수에 의존합니다. 윈도 XP 이후로는 카드 배열 번호가 1,000,000번까지 확장되어 더(?) 다양한 게임을 즐길 수 있습니다. 댓글에 깰수 없는 배열들 리스트가 있다고 적어주신 부분도 흥미롭네요.

## Topic Body

많은 분들이 플레이 해 보셨을 윈도의 프리셀은 카드를 무작위로 배열하고, 각 카드 배열마다 번호가 붙어있습니다. 같은 번호를 선택하면 동일하게 카드가 배열되죠.  
  
윈도 2000 이전까지는 1~32,000번까지 있었지만 XP 이후로 1,000,000번까지 늘어났습니다.  
  
번호를 입력했을 때 카드 배열을 생성하는 알고리즘은 공개되어 있어 다른 프리셀 프로그램들에서도 사용됩니다.  
  
이 알고리즘은 짧은 C 코드로 구현되었고, MS의 컴파일러에서 구현한 ```rand()``` 함수와 ```srand()``` 함수에 종속되어 있습니다.

## Comments



### Comment 30400

- Author: valorqueen
- Created: 2024-10-25T16:42:55+09:00
- Points: 1

태그형님 잘치시네요

### Comment 30395

- Author: qdr7h
- Created: 2024-10-25T15:12:41+09:00
- Points: 1

원래 난수 발생 알고리즘은 random인 듯 보이지만 실은 그렇지 않은 pseudo-random number의 수열을 발생시키는 점화식을 사용합니다.  각 rand() 함수 구현마다 방식은 다르지만, 첫 번째 seed가 같으면 그 뒤에 따라 나오는 난수열이 동일함은 거의 모든 알고리즘이 공통으로 갖는 특성입니다.  그러니 카드 배열 알고리즘이 deterministic이라면 모든 카드 배열은 seed에 의해 deterministic으로 정해지는 셈이죠.  
  
살짝 주제에서 벗어나는 이야기지만, 얼마나 임의적으로 보이는 pseudo-random number를 생성할 수 있겠느냐도 오랜 연구 주제 중 하나였습니다.  TAOCP Vol.2에서도 이 내용을 간략하게 다룹니다.

### Comment 30401

- Author: kandk
- Created: 2024-10-25T16:43:34+09:00
- Points: 1
- Parent comment: 30395
- Depth: 1

사실 컴퓨터에서 랜덤이란 개념이 없죠.  
그래서 보통 사람의 행동을 ms단위로 측정해 이걸 랜덤 seed로 사용하죠.

### Comment 30396

- Author: dlehals2
- Created: 2024-10-25T15:24:41+09:00
- Points: 1
- Parent comment: 30395
- Depth: 1

저는 난수가 현재 시간 timestamp를 사용하는 것으로 알고 있었는데 잘못 알고 있었네요 ㅎㅎ 공유 감사합니다.

### Comment 30397

- Author: regentag
- Created: 2024-10-25T15:33:14+09:00
- Points: 1
- Parent comment: 30396
- Depth: 2

초기화 할 때 seed로 시간을 많이들 쓰긴 하지요. 시간은 계속 바뀌니까요.

### Comment 30394

- Author: regentag
- Created: 2024-10-25T14:36:58+09:00
- Points: 1

참고로 윈도 도움말에는 “증명되지는 않았지만 여기에서 플레이하는 게임은 모두 해결법이 있습니다”라고 쓰여있으나, 여러 사람들의 시도에 따르면 11982번은 지금까지는 깰 수 없는것으로 알려져있습니다.  
  
32,000번 너머에도 146692, 186216, 455889, 495505, 512118, 517776, 781948번 등 깰 수 없다고 알려진 카드 배열들이 있습니다.

### Comment 30476

- Author: namojo
- Created: 2024-10-28T14:16:54+09:00
- Points: 1
- Parent comment: 30394
- Depth: 1

아니 이걸 어떻게 적어두고 못푸는지를 알아냈을까요? 독한 분들 많군요!

### Comment 30403

- Author: bakyeono
- Created: 2024-10-25T17:04:11+09:00
- Points: 1
- Parent comment: 30394
- Depth: 1

무서운 사람들...!
