str_shuffle and randomness

前端 未结 3 568
广开言路
广开言路 2020-12-01 09:24

A while back I wrote a random string generator that builds a string using the mt_rand()th character in a string until the desired length is reached.

public         


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-01 10:16

    A better solution would be mt_rand which uses Mersenne Twister which much more better.

    As has been pointed out, the str_shuffle method is not equivalent to the code I'm already using and will be less random due to the string's characters remaining the same as the input, only with their order changed. However I'm still curious as to how the str_shuffle function randomizes its input string.

    To make the output equal lets just use 0,1 and look at the visual representation of each of the functions

    Simple Test Code

    header("Content-type: image/png");
    $im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
    $white = imagecolorallocate($im, 255, 255, 255);
    for($y = 0; $y < 512; $y ++) {
        for($x = 0; $x < 512; $x ++) {
            if (testMTRand()) { //change each function here 
                imagesetpixel($im, $x, $y, $white);
            }
        }
    }
    imagepng($im);
    imagedestroy($im);
    
    function testMTRand() {
        return mt_rand(0, 1);
    }
    
    function testRand() {
        return rand(0, 1);
    }
    
    function testShuffle() {
        return substr(str_shuffle("01"), 0, 1);
    }
    

    Output testRand()

    enter image description here

    Output testShuffle()

    enter image description here

    Output testMTRand()

    enter image description here

    So basically I'd like to know how str_shuffle randomizes the string. Is it using rand() or mt_rand()? I'm using my random string function to generate passwords, so the quality of the randomness matters.

    You can see clearly that str_shuffle produces almost same output as rand ...

提交回复
热议问题