2009-11-24 3 views
2

CenterSpace에서 다운로드 한 메르 센 트위스터의 C# 구현을 사용하고 있습니다. 나는 두 가지 문제가 있습니다 메르 센 트위스터 : 시딩 및 시각화

  1. 가 아무리 알고리즘을 씨앗 어떻게 DieHard tests을 통과하지 않습니다, 그리고 그하여 내가 P-값 1과 0의 꽤 많이 얻을 의미한다. 또한 269 p 값의 KStest는 0입니다. 음, p 값을 해석 할 수는 없지만, 결과에서 1과 0이 약간 나쁜 뉴스라고 생각합니다.
  2. 숫자의 임의성을 시각적으로 표시하도록 요청 받았습니다. 그래서 나는 그들이 생성 될 때 숫자를 플롯하고, 이것은 전혀 무작위로 보이지 않습니다. 결과는 after a few secondsa few seconds later의 두 스크린 샷입니다. 두 번째 스크린 샷에서 볼 수 있듯이 숫자는 몇 개의 평행선에 표시됩니다. 숫자에 점수를 매기는 다른 알고리즘을 시도했습니다. 그것들은 모두 평행선이되지만 각도가 다릅니다! 이것이이 스크린 샷의 숫자를 점으로 매핑 한 방법입니다 : new Point(number % _canvasWidth, number % _canvasHeight). 추측 할 수 있듯이 시각적 결과는 양식의 너비와 높이에 따라 달라지며 this is은 재앙적인 결과를 낳습니다.

    1. 사용자 항목 :

    는 여기에 내가 알고리즘을 씨앗하려고 몇 가지 방법입니다. 몇 가지 숫자를 입력하여 알고리즘을 int 배열로 시드합니다.

  3. 알고리즘 자체에서 생성 한 난수입니다 !!
  4. 내가 여기 실종 무엇 new Guid().GetHashCode()

의 배열? 알고리즘을 어떻게 분류해야합니까? DieHard를 어떻게 통과시킬 수 있습니까?

답변

3

첫 번째 문제는 말할 수 없지만 두 번째 문제는 그려야 할 점을 계산하는 방법과 관련이 있습니다. 구체적으로,

x = number % _canvasWidth; 
y = number % _canvasHeight; 

당신이 그리는 창의 종횡비에 다소 일치하는 "패턴"을 제공합니다. 예를 들어 _canvasWidth_canvasHeight이 같으면 항상 대각선을 그릴 것이며 xy은 항상 동일합니다. 이 경우에는이 그래픽 표현이 적합하지 않습니다.

RNG 출력의 N 비트를 가져 와서 x 좌표에 반을 사용하고 y 좌표에 나머지 반을 사용하면 어떨까요? 비트의 범위를 매핑하는 선형 보간을 수행

  1. 이 그들을 잡아 (또는 오프 스크린을 그릴)하지 마십시오
  2. : 창문의 경계에서 가을 그 비트에 대한 두 가지 옵션을 고려하는 것이 좋습니다 귀하의 윈도우의 너비/높이에

두 옵션 중 임의의 숫자 생성기를 가져 오는 비트의 대표적인 그림을 제공해야합니다. 행운을 빕니다!

+0

답변 주셔서 감사합니다 fbrereto. 너비와 높이가 동일하다는 사실에 대한 관찰은 사실입니다. 나는 내가 어떻게 그것을 놓쳤는 지 모른다 : 다음은 매핑을 시작한 방법이다 : var x = (int) (number & 0xffff0000); var y = 숫자 & 0x0000ffff; x = x % _canvasWidth; y = y % _canvasHeight; 이것은 사용자의 솔루션과 다소 유사합니다. 그러나, 나는 mod 함수가 여전히 결과를 왜곡한다고 생각합니다. 참고로이 매핑을 사용하면 세로 줄이 나타납니다. –

+0

x 값을 아래로 이동해야합니다. 비트 마스크 이후에 숫자 출력의 상위 2 바이트에 상주합니다.이 숫자는 모두 MOD를 왜곡시킬 수있는 큰 숫자가됩니다. – fbrereto

+0

mod는 결과를 화면에 표시 할 때 항상 약간의 바이어스를 보일 것입니다. 당신이하려고하는 것으로, 커다란 좌표 (창 밖의 좌표) 또는 선형 보간을 그리지 않는 것이 좋습니다. – fbrereto

-1

True random 숫자 생성은 수학 함수로 수행 할 수 없습니다. 진정한 난수를 갖는 것이 중요하다면 hardware random number generator을 얻으십시오. 나는 진짜 돈 온라인 포커 게임을 개발했습니다. 그러한 하드웨어는 숫자에 패턴이 없다고 확신 할 수있는 유일한 방법입니다.

Linux 환경을 대상으로 할 경우 /dev/random and /dev/urandom pseudo devices은 하드웨어 작동을 나타내는 난수를 포함하기 때문에 수학적 생성기보다 훨씬 뛰어납니다.

+0

응답 해 주셔서 감사합니다. Mersenne Twister를 RNG 용으로 사용하는 수많은 온라인 게임 사이트가 있습니다. http://practice.galewindsoftware.ca/demo/casino/help/certified/RNG_Certification_Galewind_Software.pdf 및 http://www.pkr.com/ en/support/licensing-and-integrity/monthly-certificates/ –

+0

-1 : 이것은 FUD입니다. Mersenne 트위스터 알고리즘은 매우 우수한 난수를 생성합니다. 파이썬의 기본 난수 알고리즘입니다. 기술적으로 의사 무작위 적이지만 관찰 할 수있는 우주의 입자 수보다 큰 우스꽝스러운 반복주기가 있습니다. 당신의 주장은 근거가 없습니다. –

+1

메르 센 트위스터의 구현을 사용한 블랙 잭 웹 사이트에 돈을 걸고 싶습니까? 구현이 정확하고 정직하게 표시 될 수 있는지 여부는 난수 생성기를 연결하는 것보다 훨씬 더 효과적입니다. – wallyk

0

x 및 y 좌표 각각에 대해 새로운 난수를 생성하여 줄무늬 점 플로팅 문제를 쉽게 해결해야합니다. x와 y에 대해 하나의 생성 된 숫자를 재사용하는 것은 기본적으로 조숙 한 최적화이지만, 그 경로를 따라 간다면 숫자에서 각각 다른 비트를 추출해야합니다. 즉, x=n%width;y=n%height은 이미지에서 볼 수 있듯이 x와 y 사이에 엄청난 상관 관계를 제공합니다.

나는 (종자 관련 또는 기타) random points를 생성하는 (가장 최근에 boost 년대) 년 동안 다양한 C++ 메르 센 트위스터 구현을 사용하고 그것으로 아무런 어려움이 없었다 왔습니다. 정말 멋진 발전기입니다.

+0

두 번째 문제에 대한 해결책과 같이 음모를 꾸미기 위해 두 개의 숫자를 사용하지만 어떤 이유로 그것이 나를 죄책감을 느끼게합니다!나는 사용자와 아마 감사인을 의미하며, 각 포인트는 하나의 숫자를 나타냅니다! MT에 대한 경험으로 보통 어떻게 시드합니까? dieHard에 대한 의견이 있으십니까? –

관련 문제