방금 php rand() 함수에 대해 고민하던 중 어떻게 리메이크 할 수 있을지 고민하던 중

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

댓글

  • 의사 난수 생성기는 시드를 사용합니다. 미리 정의 된 상수 및 수학 공식 테이블. 실수 난수 생성기는 일반적으로 대기 노이즈를 사용합니다. / dev / random을 읽고 난수를 쉽게 얻을 수 있습니다.
  • 대기 소음은 무작위로 보장됩니까?
  • random.org에는 난수와 그 숫자가 ' 생성되는 방법 에 대한 꽤 좋은 토론입니다.
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • 누군가이 작업을 수행해야합니다. xkcd.com/221 😉

답변

Random Number Generators (RNG)는 실제로 TRULY 난수를 생성하는 것이 불가능하기 때문에 의사 난수를 생성합니다. 진정으로 난수를 생성하는 유일한 것은 번개와 같은 신.

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


내가 이해 한 바에 따르면 RNG에는 기본적으로 두 부분이 있습니다. 시드와 그 시드에서 선택한 난수입니다. RNG를 시드 할 때 시작점과 동등하다 int. 그 시작점에는 프로그램이 선택하는 “내부”숫자가 있습니다. PHP에서는 srand ()를 사용하여 시드를 “셔플”할 수 있으므로 거의 항상 다른 답을 얻을 수 있습니다. 그런 다음 rand (min, max)를 사용하여 시드로 이동하여 최소와 최대 사이의 숫자를 선택할 수 있습니다.


경고, 가능한 치즈 아날로그!

각 “씨앗”을 얼음 상자로 생각하고 난수를 얼음 조각으로 생각하십시오. 1000 개의 얼음 상자가 있고 각 상자에는 1000 개의 얼음이 들어 있다고 가정 해 보겠습니다. 카운티 박람회에서 그들은 음료수로 사용할 얼음 상자를 선택하고 하나의 얼음 만 사용할 수 있습니다. 그러나 1 입방 인치보다 큰 얼음 조각 만 있으면됩니다. 그래서 그들은 1000 개의 상자 사이에서 무작위로 상자를 선택하고 그 상자 안에있는 얼음을 무작위로 선택합니다. 원하는 크기로 작동하면 사용합니다. 그렇지 않다면 다른 사람들과 함께 가슴에 다시 넣습니다. 좀 더 재미있게 만들고 싶다면 미리 상자를 바꿔서 완전히 잊혀지 게합니다!

어떻게 PHP 실제로는 시드와 난수를 물리적으로 선택합니다. 그에 대한 충분한 지식이 없습니다 (아마 가장 궁금한 점이있을 것입니다!). 저는 rand () 함수를 다시 실행하지 않을 것입니다. 여러분이 만들 대부분의 웹 기반 애플리케이션에서 rand ()는 필요한 임의의 숫자로 충분해야합니다.

또한 선형 합동을 확인하십시오. 더티 세부 정보를 원하면 “찾고있는 것보다 더 많을 수 있습니다. http://en.wikipedia.org/wiki/Linear_congruential_generator

도움이 되었기를 바랍니다.

댓글

  • god의 행동이 어떻게 무작위일까요? 조금이라도? 또한 번개는 ' 무작위가 아니며 다양한 조건에 따라 결정된 경로를 따릅니다. 또한 번호를 생성하는 통역사는 본질적으로 관련이 없습니다.
  • 나는 ' 법적 의미에서 하나님의 행위를 사용합니다. en.wikipedia.org/wiki/Act_of_God 그들은 명백한 인간의 통제를 벗어나기 때문에 무작위로 간주됩니다.
  • 기본적으로 무작위적인 것은 없습니다. 하지만 이렇게하려면 무작위로 보이는 모든 발생에 영향을 주어야하는데, ' 초기에 도달하면 작동하지 않습니다 …. 나처럼 보입니다. ' 철학 수업을 듣겠습니다. = D
  • @Korvin, 우리가 아는 한 방사성 붕괴와 같은 양자 현상 또는 여기 된 원자에 의한 광자 방출은 실제로 무작위입니다. . 그러나 수학자와 철학자들은 진정으로 무작위라는 것이 무엇을 의미하는지 논쟁합니다. 일반 사람들은 동전 던지기가 매우 무작위라고 생각하지만, 민첩한 무대 마술사 ( news.stanford.edu/pr/2004/diaconis-69.html )는 정기적으로 10 번 뒤집기에서 앞면 10 개를 얻습니다.
  • @Charles-동전 던지기는 ' 이진 머리 / 꼬리조차도 아닙니다. '는 실제로 앞면 / 꼬리 / 가장자리이므로 정말 훌륭한 무대 마술사라면 앞면도 뒷면도 내리지 않을 수 있습니다. * 8 ')

답변

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

의사 난수에는 실제 난수가없는 유용한 속성이 하나 있습니다. 시작할 때 동일한 시드를 사용하면 동일한 시퀀스가 반환됩니다. 이는 테스트에 매우 편리 할 수 있습니다.

댓글

답변

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

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

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

ADC가 없더라도 디지털 GPIO 핀에 연결된 몇 개의 요소는 꽤 좋은 결과를 생성합니다. 임베디드에서 노이즈는 ev er-present (그리고 지속적으로 싸웠습니다) 그래서 진정한 임의성을 얻는 것은 매우 쉽습니다.

답변

여러 가지 방법이 있습니다. 숫자의 “무작위”시퀀스를 모방하려고합니다. 먼저 선형 합동 생성기 에 대해 읽어야합니다. 이것이 가장 기본적인 난수 생성기가 작동하는 방식이며, PHP의 rand () 함수가 작동하는 방식이라고 확신합니다.

다음으로 생각할 더 흥미로운 질문은 어떻게 자체적으로 시드합니까? time ? IP 주소? 등

댓글

  • 시드는 나를 혼란스럽게합니다. ' 어떤 패턴없이 함수를 시드 할 수있는 것은 생각하지 마십시오. 그렇지 않더라도 처음에 랜덤 시드가 생성되는 원인은 무엇입니까?
  • 타임 스탬프가 자주 발생한다고 생각합니다. 다른 소스에서 실제로 제공되지 않은 경우 초기 시드로 사용됩니다. 이전 BASIC에서는 RANDOMIZE TIMER가 일반적인 관용구였으며 " 좋습니다. 대부분의 (비 암호화) 목적에 충분한 "입니다. man 3 srand 에 따르면 GNU C 라이브러리는 PRNG가 다시 시드 될 때까지 1의 고정 시드.

답변

우선, 거의 모두 rand() 함수는 진정한 임의성을 제공하지 않고 소위 의사 난수를 제공합니다.

그러면 의사 난수 생성기는 어떻게 작동합니까? 기본적으로 암호화가 작동하는 것과 같은 방식으로 : 일부 입력을 받아 출력에서 입력을 추측하거나 그 반대의 경우 불가능할 정도로 복잡한 방식으로 일부 출력을 생성하는 함수 (해시)가 있습니다. 즉, 모든 사이퍼를 사용하여 좋은 의사 난수 생성기를 만들 수 있습니다. 그러나 원칙적으로 모든 의사 난수 생성기를 사용하여 암호화를 수행 할 수 있지만 대부분의 의사 난수 생성기는 주로 암호화 보안이 아닌 속도를 위해 개발되었으므로 해커에게 골칫거리를주지 않습니다.

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


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

답변

난수는 출력을 예측할 수없는 프로세스에 의해 생성 된 숫자입니다. 즉, 다음 결과물이 무엇인지 알 수 없습니다. 주사위의 몇 가지 간단한 예를 들어 볼 수 있습니다. 주사위를 던질 때 출력되는 것은 예측할 수 없습니다.

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

난수 생성 방법

댓글

  • 따옴표 형식을 사용하여 답변은 귀하의 것이며 귀하가 인용 한 출처에서 가져온 것입니다. 모든 답변이 외부 소스의 복사 / 붙여 넣기 인 경우 ' 여기에서 좋은 답변이 아닙니다.
  • 그렇지 않습니다. ' 이전 6 개의 답변에서 이루어지고 설명 된 점수에 비해 상당한 것을 제공하지 않는 것 같습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다