난수 생성기는 어떻게 작동합니까?


23

나는 단지 PHP rand()기능 에 대해 숙고하고 그것을 다시 만들 수있는 방법에 대해 생각하고 완전히 혼란에 빠졌습니다.

난수 생성기는 어떻게 작동합니까?


2
의사 난수 생성기는 시드, 사전 정의 된 상수 테이블 및 수학 공식을 사용합니다. 실수 난수 발생기는 일반적으로 대기 소음을 사용합니다. / dev / random을 읽고 난수를 쉽게 얻을 수 있습니다.
rightfold

대기 소음은 무작위로 보장됩니까?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }

3
누군가 이것을해야합니다 : xkcd.com/221 ;)
Valera Kolupaev

답변:


7

난수 생성기 (RNG)는 실제로 실제 난수를 생성하는 것이 불가능하기 때문에 실제로 의사 난수를 생성합니다. 정말로 참으로 무작위적인 것은 번개처럼 하나님의 행동입니다.

이 위키 백과 기사는 설명에 도움이 될 수 있습니다. http://en.wikipedia.org/wiki/Random_number_generators


내가 이해 한 바에 따르면, 기본적으로 RNG에는 두 가지 부분이 있습니다 : 씨앗과 그 씨앗에서 선택한 난수. RNG를 시드 할 때 시작점에 해당합니다. 그 시작점에는 프로그램이 선택하는 "내부"에 숫자가 많이 있습니다. PHP에서는 srand ()를 사용하여 시드를 "셔플 링"할 수 있으므로 거의 항상 다른 답변을 얻을 수 있습니다. 그런 다음 rand (min, max)를 사용하여 시드로 들어가서 최소값과 최대 값 사이의 숫자를 선택할 수 있습니다.


경고, 가능한 치즈 분석이 앞서 있습니다!

각각의 '씨'를 얼음 상자로, 난수를 얼음 조각으로 생각하십시오. 얼음 상자가 1000 개 있고 각 상자에 1000 개의 얼음 조각이 있다고 가정 해 봅시다. 카운티 박람회에서는 음료 상자에 사용할 아이스 체스트를 선택하고 아이스 큐브 하나만 사용할 수 있습니다. 그러나 그들은 1 입방 인치보다 큰 아이스 큐브 만 필요합니다. 그래서 그들은 1000 개의 가슴 사이에서 무작위로 가슴을 선택하고 그 가슴 안에서 얼음 덩어리를 무작위로 선택합니다. 원하는 크기로 작동하면 사용합니다. 그렇지 않은 경우 다른 사람과 함께 가슴에 다시 넣습니다. 그들이 좀 더 재미있게 만들고 싶다면, 당신이 원한다면, 가슴을 완전히 잊어 버리기 위해 미리 가슴을 바꾼다!

PHP가 실제로 시드와 난수를 실제로 어떻게 선택하는지에 관해서는, 나는 그것에 대해 충분한 지식이 없습니다 (아마도 당신이 가장 궁금했던 것입니다!). 나는 rand () 함수를 다시 시도하지 않을 것이다. 대부분의 웹 기반 응용 프로그램에서 rand ()는 필요한 임의의 숫자로 충분합니다.

또한 선형 합동 생성기를 확인하십시오. 더러운 세부 사항을 원할 경우 찾고있는 것이 더 많을 수 있습니다. http://en.wikipedia.org/wiki/Linear_congruential_generator

이것이 도움이되기를 바랍니다!


7
god최소 비트에서 어떻게 무작위로 행동 합니까? 또한 번개는 무작위가 아니며 다양한 조건에 따라 결정된 경로를 따릅니다. 또한 숫자를 생성하는 인터프리터는 본질적으로 관련이 없습니다.

7
나는 법적 의미에서 하나님의 행위를 사용하고 있습니다 : en.wikipedia.org/wiki/Act_of_God 그들은 분명 인간의 통제 할 수없는 때문에 그들은 무작위로 간주됩니다.

4
따라서 본질적으로 임의의 것은 없습니다. 그러나 그것은 모든 겉보기에 임의의 출현이 영향을 미치도록 요구할 것입니다. 이것은 당신이 처음에 도착했을 때 효과가 없습니다 .... 나는 어떤 철학 수업을들을 것 같습니다 = D

6
@Korvin, 우리가 아는 한, 방사성 붕괴와 같은 양자 현상, 또는 여기 된 원자에 의한 광자의 방출은 실제로 무작위입니다. 그러나 수학자와 철학자들은 진정으로 무작위라는 것이 무엇을 의미하는지 논쟁합니다. 그리고 일반 사람들은 동전 던지기가 매우 무작위라고 생각하지만 민첩한 단계 마술사 ( news.stanford.edu/pr/2004/diaconis-69.html )는 정기적으로 10 플립에 10 머리를 얻을 수 있습니다.
찰스 E. 그랜트

1
@Charles-동전 던지기는 이진 머리 / 꼬리조차 아니고, 실제로 머리 / 꼬리 / 가장자리이므로 정말 좋은 무대 마술사가 머리 나 꼬리도 쓰러지지 않을 수 있습니다. * 8 ')
Mark Booth

18

일반적으로 무작위는 아니지만 무작위로 보이는 숫자 시퀀스를 생성하기 때문에 의사 난수라고합니다. 이것은 흥미로운 수학 공식으로 수행됩니다. 가장 일반적인 것 중 하나는 선형 일치 생성기 입니다.

의사 난수에는 실제 난수에는없는 유용한 속성이 있습니다. 시작할 때 동일한 시드를 사용하면 동일한 시퀀스를 다시 얻게됩니다. 이것은 테스트에 매우 유용 할 수 있습니다.


두 번째 진술을 올바르게 이해한다면 : random(5332)항상 같 random(5332)습니까?

2
@Korvin, 아니오, 전화 srand(5332)하면 다음에 반환 된 번호 rand는 항상 동일합니다.
Mark Ransom

3
"임의로 나타남"-> 진정한 난수와 동일한 통계적 속성을 갖습니다.

LGC Wikipedia 링크의 경우 +1로, 다차원 몬테카를로 시뮬레이션을 수행 할 때 간체 PRNG가 심각한 제한을 갖는 이유에 대한 훌륭한 애니메이션 이 있습니다 .
Mark Booth

4

의사 난수 또는 랜덤을 요구하고 있습니까? 다른 사람들은 의사 난수에 대해 대답했습니다. 랜덤에 대해 이야기하겠습니다.

실제 하드웨어 기반 난수 생성기가 판매되었습니다. 우주 공간의 백색 잡음을 측정하는 작은 무선 장치 또는 작은 방사성 샘플과 그 붕괴 사이의주기를 측정하는 칩을 기반으로했습니다. 그것들의 문제는 대역폭이었습니다. 그들이 생성 할 수있는 엔트로피의 양은 그다지 높지 않았기 때문에 의사 난수 알고리즘의 시드에 사용되었습니다. 그들은 은행 시스템, 높은 보안 등에서 사용되었습니다.

OTOH, 임베디드 시스템 개발자를 만나면 웃을 것입니다. 마이크로 컨트롤러 프로그래밍의 일반적인 목적으로, 플로팅 (연결되지 않은) 핀을 사용하여 16 비트 아날로그-디지털 컨버터의 낮은 4 비트를 읽으면 충분한 대역폭 (완료 폴링 기간이 짧을수록 " 시끄러운 "판독), 실제 RNG 루틴을 작성하는 것보다 쉽습니다. 그리고 ADC가 일반적으로 마이크로 컨트롤러의 실리콘으로 구현되고, 일반적으로 구현되며, 애플리케이션에 5 개가 필요할 수있는 8 개의 채널로 구현되는 경우를 고려하면 실제로 무료입니다.

ADC가 없어도 디지털 GPIO 핀에 연결된 몇 가지 요소는 상당히 좋은 노이즈를 생성합니다. 임베디드에서 노이즈는 항상 존재하며 지속적으로 싸우므로 진정한 임의성을 얻는 것은 매우 쉽습니다.


2

"임의의"순서의 숫자를 모방하려고 시도하는 방법에는 여러 가지가 있습니다. 첫 번째는 선형 합동 발생기 에 대해 읽어야 합니다. 이것은 대부분의 기본 난수 생성기가 작동하는 방식이며 PHP의 rand () 함수가 작동하는 방식입니다.

더 흥미로운 다음 질문은 그 자체가 어떻게 씨를 뿌리 는가입니다. 시각? IP 주소? 기타


씨앗은 혼란 스럽습니다. 어떤 종류의 패턴없이 함수를 시드 할 수있는 것을 생각할 수 없으며, 그렇지 않은 경우에도 무작위 시드가 처음에 생성되는 원인은 무엇입니까!

3
타임 스탬프가 다른 소스에서 실제로 제공되지 않은 경우 초기 시드로 자주 사용됩니다. 예전의 BASIC에서는 RANDOMIZE TIMER일반적인 관용구였으며 대부분의 (암호화가 아닌) 목적을 위해 "충분히"좋습니다. man 3 srand 에 따르면 GNU C 라이브러리는 PRNG가 다시 시드 될 때까지 고정 된 시드 1을 사용합니다.
CVn

1

우선, 사실상 모든 rand()함수는 진정한 임의성을 제공하지 않으며, 소위 의사 난수를 제공합니다.

그렇다면 의사 난수 생성기는 어떻게 작동합니까? 기본적으로 암호화가 작동하는 것과 같은 방식으로 : 일부 입력을 가져오고 출력에서 ​​입력을 추측하거나 그 반대로 할 수없는 복잡한 방식으로 일부 출력을 생성하는 함수 (해시)가 있습니다. 즉, 모든 사이퍼는 다소 좋은 의사 랜덤 생성기를 생성하는 데 사용될 수 있습니다. 그러나 의사 난수 생성기를 사용하여 암호화를 원칙적으로 수행 할 수 있지만 대부분의 의사 난수 생성기는 주로 암호화 보안이 아닌 속도를 위해 개발되므로 해커에게 두통을주지 않습니다.

의사 랜덤 생성기의 경우 해싱 함수는 생성기의 숨겨진 내부 상태에 적용되며 출력은 a) 해당 내부 상태를 수정하고 b) rand()함수 의 출력을 계산하는 데 사용 됩니다. 다음에 호출 rand()하면 변경된 내부 상태를 사용하여 다른 결과를 생성합니다. 해시 함수가 좋을수록 결과가 실제 난수와 덜 쉽게 구별됩니다.


실제로 오늘날 컴퓨터는 실제 임의의 숫자에 액세스 할 수 있습니다. 컴퓨터는 외부 장치에 의해 생성 된 인터럽트 타이밍의 지터에서 비롯됩니다. 리눅스는 이러한 작은 불확실성 값을 사용하여 몇 킬로바이트의 내부 상태 인 "엔트로피 풀"을 끊임없이 저어줍니다. 이 엔트로피 풀을 기반으로 한 암호화 해시는 /dev/random/dev/urandom장치 를 통해 제공됩니다 . 따라서 정말 좋은 임의의 숫자에 액세스하는 것은이 두 장치 중 하나를 열고 몇 바이트를 읽는 것만 큼 간단합니다.


-2

난수는 출력을 예측할 수없는 프로세스에서 생성 된 숫자입니다. 즉, 다음 출력이 무엇인지 알 수 없습니다. 주사위의 간단한 예를 들어 보겠습니다. 주사위를 던질 때 어떤 결과가 나올지 예측할 수 없습니다.

난수 1에는 두 가지 유형이 있습니다. 참 난수 2. 의사 난수.

난수 생성 방법


1
따옴표 형식을 사용하여 답변의 어느 부분이 귀하의 것인지, 그리고 귀하가 인용 한 출처에서 나온 부분을 강조하십시오. 모든 답변이 외부 소스의 복사 / 붙여 넣기 인 경우 여기에 적합한 답변이 아닙니다.
Mat

이것은 이전의 6 가지 답변에서 제시되고 설명 된 포인트를 넘어서는 실질적인 것을 제공하지 않는 것 같습니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.