在PHP中为随机数生成器设定种子
我有一个应用程序,需要根据数字的权重从多个数字中选择一个。每次选择后,我都要把结果发送到Flash。我在Python中找到了一个算法,并把它实现到了PHP中,正在测试结果。如果我在Python中运行这个算法,结果很好,但在PHP中就不太理想。例如,(1=>30, 2=>40, 3=>30)。经过多次运行后,权重数组中第一个数字出现的概率总是更高,而在Python中则是均匀的。我附上了PHP代码。
define("MAX",100000);
$reelfrequencies=array(30,40,30);
echo weightedselect($reelfrequencies);
/*function weightedselect($frequency)
{
$arr=cumWghtArray($frequency);//array(35,96,100);
print_r($arr);
$len=sizeof($frequency);
$count=array();
echo $r=mt_rand(0,$arr[$len-1]);
$index=binarysearch($arr,$r,0,$len-1);
return $index;
}*/
function cumWghtArray($arr)
{
$cumArr=array();
$cum=0;
$size=sizeof($arr);
for($i=0;$i<$size;$i++)
{
$cum+=$arr[$i];
array_push($cumArr,$cum);
}
return $cumArr;
}
function weightedselect($frequency)
{
$arr=cumWghtArray($frequency);//array(35,96,100);
$len=sizeof($frequency);
$count=array();
$count[0]=$count[1]=$count[2]=0;
for($i=0;$i<MAX;$i++)
{
$r=mt_rand(0,$arr[$len-1]);
$index=binarysearch($arr,$r,0,$len-1);
$count[$index]++;
}
for($i=0;$i<3;$i++)
{
$count[$i]/=MAX;
echo $i." ".$count[$i]."\n";
}
}
function binarySearch($ar,$value,$first,$last)
{
if($last<$first)
return -1;
$mid=intVal(($first+$last)/2);
$a=$ar[$mid];
if($a===$value)
return $mid;
if($a>$value&&(($mid-1>=0&&$ar[$mid-1]<$value)||$mid==0))
return $mid;
else if($a>$value)
$last=$mid-1;
else if($a<$value)
$first=$mid+1;
return binarySearch($ar,$value,$first,$last);
}
这是我从论坛上找到的Python代码: import random import bisect import collections
def cdf(weights):
total=sum(weights)
result=[]
cumsum=0
for w in weights:
cumsum+=w
result.append(cumsum/total)
return result
def choice(population,weights):
assert len(population) == len(weights)
cdf_vals=cdf(weights)
x=random.random()
idx=bisect.bisect(cdf_vals,x)
return population[idx]
weights=[0.30,0.40,0.30]
population="ABC"
counts={"A":0.0,"B":0.0,"C":0.0}
max=10000
for i in range(max):
c=choice(population,weights)
counts[c]=counts[c]+1
print(counts)
for k, v in counts.iteritems():
counts[k]=v/max
print(counts)
问题出在mt_rand()函数上,它的随机性不均匀。而Python的random.rand()函数则非常均匀。我应该在PHP中使用哪个随机函数,并且每次运行时都要有合适的种子值。我在考虑使用Withcmann(Python random.random使用的),但我该如何提供种子呢?
1 个回答
2
其实,rand
和 mt_rand
这两个函数都能提供足够随机的结果,适合你的需求。如果你需要给 mt_rand
设置种子,可以用 mt_srand
,但自从 PHP 4.2 之后,这个步骤已经自动处理好了,所以你不需要担心。
我觉得问题可能出在你的代码上,看起来有点复杂,而你其实只是想根据权重随机选择一个数字。
这可能对你有帮助:在 PHP 中按权重生成随机结果?