이런식으로 설정
사실 난수생성기보다는 '오버플로우를 활용해서 모듈로 연산 공짜로 수행하기' <-- 이게 핵심 같음.
기본적으로 팩토리오의 정수형은 32비트고 이 범위를 초과하면 앞자리는 버려지게 됨
그림으로 나타내면 이런 모양이다
나는 '둘레가 2^32인 원(= 정수형)을 빨간 선(= 현재 신호값)이 돌고 있다'고 상상하고 있음
숫자를 계속 더해서 화살표의 길이(= 총 신호값)가 원의 둘레보다 커지면 오버플로우가 일어난다
아까 비유를 계속 하자면 '빨간 선이 위치한 곳'만 저장되기 때문에 0.07바퀴를 돌았는지 3.07바퀴를 돌았는지 1842.07바퀴를 돌았는지 알 수 없다는 뜻
그럼 매 틱마다 빨간 화살표의 길이가 원의 둘레 * p/q만큼 늘어나면 녹색 X표시를 몇 번이나 통과할까?
실행 시간 * p/q 번 통과하겠지
예를 들어 화살표의 길이가 매 틱 원의 길이 * 0.3715씩 늘어나고 10000틱동안 진행한다면 녹색 X를 3715번 통과했다는 걸 세보지 않고도 알 수 있다
통과했는지 안 했는지는 어떻게 알아낼까
이것도 조합기 없이 알아낼 수 있다. 그냥 신호값 < (화살표의 길이 + 32비트 정수의 최솟값)를 컨트롤하고 싶은 기계의 작동조건으로 걸어두면 된다
빨간 선이 이동하는 거리가 녹색 화살표의 길이와 동일하니 "녹색 화살표 위에 떨어졌다"와 "녹색 X표를 통과했다"가 동치임
32비트 최솟값을 더해줘야 하는 이유는?
녹색 화살표 위에 올라가 있는지 판단하려면 조건 두 개(화살표 시작보다 뒤에 있는지, 화살표 끝보다 앞에 있는지)가 필요한데
화살표 시작을 -2^31으로 해 버리면 그보다 크다는건 항상 참이 되므로 그냥 생략할 수 있기 때문이다
여기서 설계상의 차이점이 나오는데
이전 버전이 '무작위적으로 작동하는데 빈도가 0.3715에 수렴함' 이었다면 이제는 펄스가 최대한 골고루 퍼지게 됨
X X O O X X X X X O X 이렇게가 아니라 X O X X X O X X X O X 이런 식으로 균일하게..
빈도가 0.5를 넘어설 때는 수량비교를 (빈도-1) * 2^32로 설정하면 되니 모든 케이스에 대응이 가능함
뭔 말이냐면 인게임에서는 '화살표의 길이가 원 둘레의 반을 넘을수 없다'는 제한이 걸려 있지만 어차피 0.6바퀴를 앞으로 움직이나 0.4바퀴를 뒤로 움직이나 결과는 똑같으니 그냥 길이가 -0.4바퀴라고 해버리면 된다는거
간단히 벨트로 구현해 봄
위에서부터 녹벨의 1/13, 2/13, 3/13... 속도
그리고 이건 851/1200 속도로 움직이는 펌프 구현한거
난수생성기에 연결된 버전과는 다르게 최대한 일정한 속도로 움직이기 때문에 값이 튀지 않고 850~851 사이에서만 움직인다
아니..?! 이렇게나 빠르게 개선판이?
확실히 이쪽이 더 결정론적이네, 이전거는 정밀제어보다는 난수발생기쪽에 더 어울릴지도
질문1. 비교기 입력 조건은 무조건 참이면 되는 거지.? 질문2. 벨트나 펌프 동작부에는 위에 녹색 조건 문 걸어주면 되고?
그냥 항상 참이어도 가능하고 조건을 추가로 걸어주면 원치 않을 때는 아얘 작동을 멈춰버릴 수도 있겠지 동작부 조건이 녹색 식이면 됨ㅇㅇ ✅+ < (상수값) 2^32*p/q-2^31 이렇게 적어주면 될거.
ㅁㅊ... 실시간 육성으로 놀랐다 진짜 이래서 기초학문이 튼튼해야 응용기술이 발전하는구나
이걸로 전글에서 했던 테스트를 다시 해보고있는데 확실히 결정론적이야 근데 테스트키트를 구성하면서 약간의 단점이 보이는데 이전버전이 다른펄스비율을 가진 여러개의 구동부를 조합기하나가 전부 제어할수 있었던것에 반해 이건 각 구동부마다 조합기가 하나씩 필요하긴하네 물론 어느쪽도 실사용영역에서 문제될만한건 아니지만
그냥 조합기 출력에 다른신호도 같이 출력하게 세팅해버리면 하나로도 되긴할듯?
@이파 허 그렇네.. 온갖신호 다 넣어도 전부 따로 돌아가겠구나
@이파 펄스제어기 전역망에다가 하나 연결해놓고 사용할때는 전역망에서 신호 땡겨쓰면 조합기 0개 처럼 보이는 세팅도 가능하겠는데?
@팩붕이1(123.199) 그거하자고 전역망에 그거할당하는건 좀 아깝다는 생각이 들어 ㅋㅋ
@이파 난수발생기 입력을 전역망에 셔플신호같은걸로 넣어두는건 고려해볼만 할지도, 신호 하나정도니까
@팩붕이1(123.199) 조합기 하나 줄이자고 더 큰 레이더를 설치해야한다고!!
완전히 이해했어 콘
시그마델타가 기준점 넘으면 빼주는건데 그걸 오버플로우로 해결하네 ㅋㅋㅋ 캬
일단 동그라미까진 이해함 - dc App
천재다!