문제

나는 단지 그것을 사용하는 것을 안다 rand() 자신이 무엇을 하고 있는지 알고 있고 서버에 액세스할 수 있다면 예측 가능합니다.

나는 프로젝트를 가지고있다. 고도로 가능한 한 예측할 수 없는 난수를 선택하는 것에 따라 달라집니다.그래서 저는 다른 내장 함수나 사용자 함수 중 하나를 생성할 수 있는 제안을 찾고 있습니다. 더 나은 임의의 숫자.

나는 이것을 약간의 테스트에 사용했습니다.

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

결과가 고르게 분포되어 있고 각 숫자가 생성되는 횟수에 이상한 패턴이 있다는 것을 알았습니다.

도움이 되었습니까?

해결책

불량한 임의 소스를 추가하거나 곱하거나 자르면 불량한 임의 결과가 제공됩니다.보다 무작위성과 난수 소개 설명을 위해.

PHP rand() 함수에 대한 당신 말이 맞습니다.의 두 번째 그림을 참조하세요. 통계 분석 인상적인 일러스트레이션을 위해.(첫 번째 그림은 인상적이지만 rand()로 표시한 것이 아니라 Scott Adams가 그린 것입니다.)

한 가지 해결책은 다음과 같은 실제 난수 생성기를 사용하는 것입니다. 무작위.org.또 다른 방법은 Linux/BSD/etc를 사용하는 경우입니다.사용하는 것입니다 /dev/무작위.무작위성이 업무상 중요한 경우에는 다음을 사용해야 합니다. 하드웨어 무작위 생성기.

다른 팁

무작위.org HTTP를 통해 액세스할 수 있는 API가 있습니다.

Random.org는 대기 노이즈를 통해 임의성을 생성하는 진정한 랜덤 숫자 서비스입니다.

나는 무작위라는 인상을 조심할 것입니다.사람들이 덜 무작위적인 분포를 선택하는 많은 실험이 있었습니다.마음은 무작위성을 생성하거나 추정하는 데 그다지 능숙하지 않은 것 같습니다.

무작위성에 관한 좋은 기사가 있습니다. Fourmilab, 다른 것을 포함하여 진정한 무작위 생성기.아마도 두 사이트 모두에서 무작위 데이터를 얻을 수 있으므로 한 사이트가 다운되더라도 다른 사이트는 그대로 유지될 수 있습니다.

Fourmilab은 또한 테스트 프로그램 무작위성을 확인하기 위해.이를 사용하여 다양한 myRand() 프로그램을 확인할 수 있습니다.

마지막 프로그램의 경우 10,000개의 값을 생성했다면 그 10,000개 중에서 최종 값을 선택하는 것이 어떨까요?당신은 자신을 하위 집합으로 제한합니다.또한 $min 및 $max가 10000보다 큰 경우에는 작동하지 않습니다.

어쨌든 필요한 임의성은 애플리케이션에 따라 다릅니다.rand()는 온라인 게임에는 적합하지만 암호화에는 적합하지 않습니다(통계 프로그램으로 철저하게 테스트되지 않은 것은 어쨌든 암호화에 적합하지 않습니다).당신이 판사가 되어보세요!

EPOCH 이후의 밀리초를 랜드의 시드로 사용하는 @KG의 변형인가요?

UUID를 얻는 것과 개념적으로 유사한 난수를 얻는 또 다른 방법

PHP 버전 5.3 이상

openssl_random_pseudo_bytes(...)

아니면 다음을 시도해 볼 수도 있습니다. 도서관 RFC4122 사용

새로운 PHP7 필요한 기능을 정확하게 수행하는 기능이 있습니다.그것은 생성한다 암호학적으로 안전한 의사 난수 정수.

int random_int ( int $min , int $max )

편견이없는 결과가 중요한 경우 사용하기에 적합한 암호화 랜덤 정수를 생성합니다 (즉포커 데크를 섞는 것).

PRNG 및 CSPRNG(및 그 차이점)에 대한 자세한 설명과 원래 접근 방식이 실제로 나쁜 생각인 이유를 보려면 내 글을 읽어보세요. 또 다른 매우 유사한 답변.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top