2011-01-08 3 views
0

을 얻기 위해 직접 시스템 시간을 사용 : 지금은 그것을 생각하는 것보다나는이 자리를 내놓았다 그래서 나는 배열에서 임의의 요소를 반환했다 임의의 숫자

return codes[(int) (System.currentTimeMillis() % codes.length - 1)]; 

, 나는 그것을 사용하는 유혹 해요 실제 코드로. Random() 시더는 어쨌든 대부분의 언어에서 시스템 시간을 시드로 사용하므로 그 시간을 직접 사용하지 않는 이유는 무엇입니까? 보너스로, 많은 RNG의 비 랜덤 비트에 대해 걱정할 필요가 없습니다. 이 해킹이 나 한테 물어서 돌아 오는거야? (언어는 Java와 관련이있다.)

답변

2

기본 제공 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의 세션 생성 알고리즘을 공격하는 방법을 설명합니다 :

,
0

나는 이것에 대해 생각할 수있는 유일한 이유는 다음과 같다. 시스템 시계가 항상 16의 배수를 반환하면 (예 : Windows XP 컴퓨터에서 발생할 수 있음), 배열의 길이가 16이됩니까?

0

표준 라이브러리 클래스가 처음 개발 된 이유는 일반적으로 있습니다.

학업 환경에서 문제를 해결하기 위해 자신의 코드를 작성하는 것이 좋습니다. 비즈니스 환경에서는 응용 프로그램에서 원하지 않는 동작을 생성 할 가능성이 적은 테스트를 거친 라이브러리와 기법을 사용하는 것이 가장 좋습니다.

기술을 사용하여 설정 한 경우 철저한 테스트 케이스를 작성하여 경계 조건을 테스트하고 많은 데이터 요소를 테스트 할 것을 강력히 권장합니다. 이렇게하면 제작에 들어가기 전에 코드를 디버그하는 데 도움이됩니다.

2

끔찍한 생각입니다. 생각조차하지 마라. 이 자생적 인 '의사 난수 생성기'에 대한 연속적인 호출은 너무 강하게 상호 연관되어있어 간단한 카운터를 사용할 수도 있습니다. (누락 된 경우에는 권장하지 않습니다.)

편집자 : 덧붙여 편집 한대로 배열 색인은 -1이되는 경우가 있습니다. 이것은 또한 끔찍한 생각입니다.

관련 문제