php lcg_value 및 mt_rand가 0에서 1까지 임의의 소수를 생성하는 효과 비교

jacklove
풀어 주다: 2023-04-01 15:28:01
원래의
1594명이 탐색했습니다.

작업을 위해 PHP를 사용하여 0~1개의 임의의 소수를 생성해야 하기 때문에 이전에 mt_rand()mt_getrandmax()를 기반으로 구현된 "0~1개의 임의의 소수를 생성하는 PHP 방법"이라는 기사를 썼습니다. .

나중에 일부 네티즌들은 PHP 기본 메서드 lcg_value()가 0에서 1까지 임의의 소수를 생성할 수 있다고 언급했습니다.

lcg_value 설명

float lcg_value ( void )
로그인 후 복사

lcg_value()는 (0, 1) 범위의 의사 난수를 반환합니다. 이 함수는 주기가 2^31 - 85 및 2^31 - 249인 두 개의 합동 생성기를 결합합니다. 이 함수의 주기는 이 두 소수의 곱과 같습니다.

반환: (0, 1) 범위의 의사 난수.

<?phpfor ($i=0; $i<5; $i++){    echo lcg_value().PHP_EOL;
}?>
로그인 후 복사

출력:

0.11516515851995
0.064684551575297
0.68275174031189
0.55730746529099
0.70215008878091
로그인 후 복사


0~1개의 난수를 생성하는 두 가지 방법 비교


1. 실행 시간 비교

mt_rand() 및 mt_getrand를 기준으로 100,000번 실행 max() 알고리즘 실행 중 time

<?php/**
 * 生成0~1随机小数
 * @param  Int   $min
 * @param  Int   $max
 * @return Float
 */function randFloat($min=0, $max=1){
    return $min + mt_rand()/mt_getrandmax() * ($max-$min);
}// 获取microtimefunction get_microtime(){
    list($usec, $sec) = explode(&#39; &#39;, microtime());    return (float)$usec + (float)$sec;
}// 记录开始时间$starttime = get_microtime();// 执行10万次获取随机小数for($i=0; $i<100000; $i++){
    randFloat();
}// 记录结束时间$endtime = get_microtime();// 输出运行时间printf("run time %f ms\r\n", ($endtime-$starttime)*1000);?>
로그인 후 복사

출력: 런타임 266.893148 ms

lcg_value() 100,000회 실행 시간

<?php// 获取microtimefunction get_microtime(){
    list($usec, $sec) = explode(&#39; &#39;, microtime());    return (float)$usec + (float)$sec;
}// 记录开始时间$starttime = get_microtime();// 执行10万次获取随机小数for($i=0; $i<100000; $i++){
    lcg_value();
}// 记录结束时间$endtime = get_microtime();// 输出运行时间printf("run time %f ms\r\n", ($endtime-$starttime)*1000);?>
로그인 후 복사

출력: 런타임 86.178064 ms

실행 시간 비교, 왜냐하면 lcg_value( )는 직접적으로 네이티브 PHP 메서드이고 mt_rand()와 mt_getrandmax()는 두 개의 메서드를 호출하고 계산을 수행해야 하므로 lcg_value()의 실행 시간이 약 3배 더 빠릅니다.


2. 무작위 효과 비교

mt_rand() 및 mt_getrandmax() 알고리즘을 기반으로 한 무작위 효과

<?php/**
 * 生成0~1随机小数
 * @param  Int   $min
 * @param  Int   $max
 * @return Float
 */function randFloat($min=0, $max=1){
    return $min + mt_rand()/mt_getrandmax() * ($max-$min);
}

header(&#39;content-type: image/png&#39;);$im = imagecreatetruecolor(512, 512);$color1 = imagecolorallocate($im, 255, 255, 255);$color2 = imagecolorallocate($im, 0, 0, 0);for($y=0; $y<512; $y++){    for($x=0; $x<512; $x++){        $rand = randFloat();        if(round($rand,2)>=0.5){
            imagesetpixel($im, $x, $y, $color1);
        }else{
            imagesetpixel($im, $x, $y, $color2);
        }
    }
}
imagepng($im);
imagedestroy($im);?>
로그인 후 복사

무작위 효과 다이어그램:

php lcg_value 및 mt_rand가 0에서 1까지 임의의 소수를 생성하는 효과 비교



lcg_value() 무작위 효과

<?phpheader(&#39;content-type: image/png&#39;);$im = imagecreatetruecolor(512, 512);$color1 = imagecolorallocate($im, 255, 255, 255);$color2 = imagecolorallocate($im, 0, 0, 0);for($y=0; $y<512; $y++){    for($x=0; $x<512; $x++){        $rand = lcg_value();        if(round($rand,2)>=0.5){
            imagesetpixel($im, $x, $y, $color1);
        }else{
            imagesetpixel($im, $x, $y, $color2);
        }
    }
}
imagepng($im);
imagedestroy($im);?>
로그인 후 복사

랜덤 효과 다이어그램:                                                                                  >

php lcg_value 및 mt_rand가 0에서 1까지 임의의 소수를 생성하는 효과 비교이 글에서는 php lcg_value와 mt_rand 사이에서 0~1개의 난수 생성 효과를 비교 설명합니다. 더 많은 관련 내용은 php 중국어 홈페이지를 참고해주세요.


관련 권장사항
PHP를 통해 ID 접두어 형식 지정 클래스를 수행하는 방법

print_r 처리된 데이터를 PHP를 통해 원래 배열로 복원하는 방법


PHP에서 PDO를 통한 연결을 판단하는 방법입니다. 가능

위 내용은 php lcg_value 및 mt_rand가 0에서 1까지 임의의 소수를 생성하는 효과 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿