今天在用PHP编写产生随机数的方法,其中有一个方法是利用二进制移位、异或生成随机数。
具体步骤如下:
1、随机生成0-65535范围内十进制整数,并转换为二进制字符串;
2、用str_shuffle()函数将二进制字符串变成新的二进制字符串;
3、将新的二进制字符串转换为十进制的整数,然后将两个十进制数进行异或运算,得到新的十进制整数;
4,除以65535,转换成0-1之间的小数;
经过for循环统计,随机效果很不理想,表现为0-0.1区间比较密集,柱状图显示成递减分布。
经测试,str_shuffle()函数随机性良好,异或过程也没问题。总感觉哪里不对劲,可又说不出来。
求高手指点。
部分代码:
......
//用mt_srand()和mt_rand()函数产生随机数$dec1,代码略
$bin1=decbin($dec1);
$bin2=str_shuffle($bin1);
$dec2=bindec($bin2);
$dec3=$dec1^$dec2;
$y=$dec3/65535;
......
本人初学,无水平可言,说的也有些乱,希望哪位达人帮忙分析原因,感激不尽。

解决方案 »

  1.   

    php有生成随机函数,不知楼主要干什么呢?
      

  2.   

    $bin1 = sprintf('%016s', decbin($dec1));decbin 不返回前导的‘0’
    于是 str_shuffle 只在 strlen($bin1) 位之间打乱
    而远算法应该是在16位之间打乱,即
    0000 0000 0000 0001
    str_shuffle 后可能为
    1000 0000 0000 0000而你的代码没有做到这点
    若 $dec1 = 10;

    $bin1 = decbin($dec1); // 1010
    $bin2 = str_shuffle($bin1); // 最大为 1100不知你明白没有