기본 제공 java.util.Random을 사용하십시오. 항목 47 of 실용적인 Java (두 번째 판, 215 페이지)은 표준 라이브러리를 자신의 롤링보다 선호해야하는 이유의 예로 이것을 나타냅니다. Math.abs(rnd.nextInt() % n
은 실제로는 임의의 분포를 나타내지 않으므로 대신 rnd.nextInt(n)
을 사용해야한다는 잘못된 설명으로 시작됩니다. 이 말을 계속 :
이 세 flays를 수정 random
방법의 버전을 작성하려면, 당신은 의사 난수 발전기, 정수론에 대한 공정한 양을 알고 있고, 2의 보완하는 것 산수.
...
당신은 nextInt(int)
이 작업을 수행하는 방법의 세부 사항과 함께 자신을 염려 할 필요가 없습니다. 알고리즘의 배경을 가진 선임 엔지니어는이 방법을 설계, 구현 및 테스트하는 데 많은 시간을 할애하여 현장의 여러 전문가에게이를 보여 주면서 올바른지 확인했습니다. 그런 다음이 라이브러리는 10 년 동안 수백만 명의 프로그래머가 광범위하게 베타 테스트를 거쳐 출시되었습니다. 이 방법에는 아직 결함이 발견되지 않았지만 발견 된 결함은 다음 relase에서 수정 될 것입니다. 표준 라이브러리를 사용하면 작성한 전문가의 지식과 그 전에 사용했던 사람들의 경험을 활용할 수 있습니다.
예에서 제시 한 코드와 정확히 동일한 코드를 사용하지는 않지만 사용자의 경우에는 더욱 그렇습니다. 임의의 정수의 나머지를 취하는 것은 분포를 비뚤어지게 만들지 만, 적어도 그것은 임의성의 어떤 외관을 가지고있다. 단지 시간을 수정하는 것은 훨씬 더 나쁜 접근법입니다.
의사 난수 생성기의 복잡성을 과소 평가합니다. 당신이 제안하고있는 접근 방식의 문제점은 배포본이 무작위적인 것과는 거리가 멀뿐만 아니라 실제로 예측할 수 있다는 것입니다. 부지깽이에서 치트를 예측할 수있는 시드를 가진 의사 랜덤 넘버 생성기를 이용하는 해커들의 실제 사례가 있습니다. 보안 소프트웨어 구축 (Viega and McGraw, 2002)에는 이러한 문제를 다루는 전체 장이 포함되어 있습니다.
실제로 PRNG가 실제로 어떻게 손상 될 수 있는지 보여주는 좋은 예입니다. 1999 년, Cigital의 Software Security Group은 ASF Software, Inc.가 배포 한 Texas Hold 'em Poker의 구현에 심각한 결함을 발견했습니다.이 착취로 부정 행위자는 실제의 각 핸드에 사용 된 정확한 데크를 계산할 수있었습니다 시각. 이것은 익스플로잇을 사용하는 플레이어가 모든 상대방의 핸드에있는 카드와 플랍을 구성하는 카드 (베팅 라운드 후에 테이블 위에 놓인 카드)를 알고 있음을 의미합니다. 속임수는 "언제든지 그들을 붙잡고 언제"안에 "언제 접을지를 알 수 있습니다. 악의적 인 공격자는 악의적 인 플레이어가 잡힐 때마다 실제 돈을 훔치는 데 악용 할 수 있습니다. 로하지만 (이것은 단지 몇 주 이전의 종이가
: (페이지 238)
여기 난수의 복잡성을 설명 두 가지 질문입니다 정말 슬픈 제목) PRNG의 예측 가능한 시드를 사용하여 PHP의 세션 생성 알고리즘을 공격하는 방법을 설명합니다 :
,