컴퓨터가 난수를 생성하는 방법에는 여러 가지가 있는데,
외부의 물리적인 도움을 받지 않고 생성되는 난수는 모두 의사 난수라고 불린다.
진정한 의미의 난수가 아니라 시드에 의해 결정되거나 (출력을 시드로서 되먹임을 하는 구조인 경우) 주기성을 가지고 반복되기 때문이다.
팩토리오 내에서 RNG를 구현 한다면 스네이크 게임 등을 만들 수 있을 것이다.
의사 난수를 생성하는 방법을 검색을 해 보니 주로 4가지 방법이 보였다.
1. 중앙제곱법
중앙제곱법은 폰 노이만이 1949년에 고안한 방법이다.
임의의 숫자를 제곱한 다음 그 숫자의 중앙 부분을 가져와 새로운 난수를 만드는 방식이다.
| 페이즈 | 대상값 | 제곱값 | 난수 |
|---|---|---|---|
| 0 | 1234 | 1522756 | 1522756 |
| 1 | 5227 | 27321529 | 27321529 |
| 2 | 3215 | 10336225 | 10336225 |
딱 봐도 엄청 예측하기 쉬워보이고, 아웃풋도 0과 9999 사이에 균일하게 분포되어 있지 않다.
2. 선형합동법(LCG)
선형합동법은 다음과 같은 점화식으로 정의된다.
여기서 X가 우리가 원하는 의사 난수 수열이고 나머지는 임의의 정수다.
ANSI C 표준은 m=2147483648, a=1103515245, c=12345로 정해져 있다.
이는 암산으로 계산하기는 살짝 어려워 보이지만 그래도 한 수를 알면 다음 수를 쉽게 계산할 수 있다.
최고의 경우 m의 주기를 기대해 볼 수 있다. (이 경우 2^32)
3. 메르센 트위스터
선형 되먹임 시프트 레지스터(LSFR)을 약간 변형한 방법인 GSFR를 이용하여 624차원 벡터를 'Twist'하는 방법이라고 한다.
무슨 말인지 잘 모르겠지만 시프트 연산의 구조 때문에 의외로 선형합동법 보다도 속도가 빠르다고 하며,
난수의 품질이 좋기 때문에 거의 모든 프로그램이 이 구조로 난수를 생성한다고 한다.
반복 주기는 2^19937-1 이라고 한다.
4. XOR 시프트
이것도 역시 LSFR을 이용하지만 메르센 트위스터보다 훨씬 간단하고 속도는 더욱 빠르다.
TeatU01 이라고 하는 난수 품질 테스트를 통과하지 못 한다고 한다.
LCG를 이용한 방법
포럼에도 몇 가지 있지만 청사진 스트링이 없으니,
위에 있는 두 조합기가 m, a, c값이 들어 있는 진짜 RNG고 밑은 출력 장치다.
먼저 위에서 점화식을 계산하고 밑에서 오른쪽 비트 시프트를 하고 65536을 더해 양수로 만든다.
그 이후 모듈로 연산을 통해 0-25 사이의 값을 뽑아낸다.
이 둘은 XOR시프트 기반 RNG이다.
밑에 있는 구조의 엔트로피 주입기가 흥미로운데, 기차가 선로를 지나갈 때 마다 신호를 입력해서 난수를 더욱 랜덤하게 만드는 구조다.
이것도 역시 XOR시프트 기반 RNG인데 위에 둘 보다 훨씬 복잡한 구조로 완전히 균일한 16비트 난수를 생성한다.
(시드와 아웃풋이 모두 16비트 숫자인데 이 둘이 일대일대응한다)
작동 구조:
인풋의 숫자를 왼쪽으로 8번 시프트 시킨다.
인풋과 방금 만든 새로운 숫자를 XOR하고 결과값을 S0으로 저장한다.
S0의 왼쪽 8비트와 오른쪽 8비트를 바꾼 다음 인풋에 덮어쓰기한다.
S0을 왼쪽으로 1번 시프트 시킨다.
FF80과 방금 만든 숫자를 XOR하고 결과값을 S1에 저장한다.
S1이 1로 끝나면 8180, 0으로 끝나면 1FF4와 XOR시키고 결과값을 인풋에 덮어쓰기한다.
S1이 22016이나 21674면 강제로 인풋을 0으로 만든다.
더 읽어볼 만한 글:
이번에는 Html 배워서 표도 걸어보고 링크 걸고 밑에 밑줄도 그어봤음
되게 깔끔해서 좋은듯
어려운데스, 그런데 적당히 생성된 난수를 어디다 써먹지. 기차선로에서 카오스주입하는거 신박해서 그런데. 우라늄광물 정체해서 가끔 나오는 238로 카오스 주입기 대체해도 될 듯 . 기차는 데드락 걸리니까 -_-)
어따 써먹을지는 잘 모르겠네. 지뢰찾기나 이런 회로 작품들에 써먹는거는 간간히 보인 거 같은데.
엔트로피 주입기는 굳이 기차로 안 해도 되고 U235로 해도 되고 로봇 수나 상자 안에 있는 아이템 개수 뭐 그런거로 해도 되지.
생각해 보면 난수로 할 수 있는거는 다 타이머로 할 수 있는 작업 같음.. 한 좝기는 1-60까지 1틱에 1씩 올라가면서 순환하고 다른 조합기는 30 이하가 입력될 때만 신호를 출력한다고 치면 장기적으로 봤을 때에는 난수랑 똑같거나 더 나을 수도 있는 거지.
이게 게임이야!! - dc App
뭔지 모르겠지만 개추준다 - dc App
ㄹㅇ ㅋㅋ
로보포트에 연결해서 사용가능한 로봇수 이런걸로 카오스 주입해도 될듯 ㅋㅋㅋ
같은 게임을 해도 다 다른 플레이를 하네.. ㄹㅇ 팩토리오는 인생이다 - dc App
사실 난수 생성기는 조합기 2개만 있어도 되고 나머지는 다 필요없음ㅋㅋㅋ 메르센 트위스터 급이 되지 않는 이상에야 다 하나씩 나사빠진 것들이고 난수를 써먹을 데도 없으니...
팩트가 요기잉네 ㅋㅋ
그 차피 C언어에서도 난수 조합 함수가 시드에 대한 고정 패턴 난수를 출력하기 때문에 시드를 정의하기 위해서 srand()를 쓰잖아 그런거 마냥 저거도 아예 시드를 삽입할수있게 하고 타이머랑 같이 써도 되지 않나 싶긴한데 팩토리오에서 난수 쓸데가 어디있음
팩토리오에서 원랜디같은거 안나오나 거기 쓰면 될텐데 ㅋㅋㅋㅋㅋ
아~~~~~ 완벽하게 이해했음. 그러니까 야스각이라는거지? - dc App
이거보고 머리아프면 정상?
무슨 논문 보는줄 ㅋㅋㅋㅋㅋㅋ
의사 난수 VS 환자 들어간수