Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中植入随机数生成器_Php_Python - Fatal编程技术网

在PHP中植入随机数生成器

在PHP中植入随机数生成器,php,python,Php,Python,我有一个应用程序,在其中我必须选择一个数字从许多数字根据其权重。每次选择时,我都会将结果发送到flash。我在python中找到了一个算法。我已经用php实现了它,并且正在测试它的结果。如果我在python中运行该算法,结果会很好,但在php中就不太好了。例如:(1=>30,2=>40,3=>30)在多次运行之后,加权数组中出现第一个数字的概率总是更高,但在python中是一致的。我已经附加了PHP代码 define("MAX",100000); $reelfrequencies=array(3

我有一个应用程序,在其中我必须选择一个数字从许多数字根据其权重。每次选择时,我都会将结果发送到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);
}

问题是mt_rand()函数不一致。python random.rand()非常统一。我应该在php中实现哪个随机函数,每次运行时使用适当的种子值。我曾考虑使用Withcmann(由python random.random使用),但我将如何提供种子。

对于您这里的任务来说,
rand
mt_rand
都应该具有足够的随机性。如果您需要播种
mt_rand
,您可以使用
mt_srand
,但因为PHP4.2已经为您完成了这项工作,所以没有必要了

我怀疑问题出在你的代码上,考虑到我相信你正在尝试做的事情,这似乎是不必要的,那就是选择一个带有加权概率的随机数


这可能会有所帮助:

谢谢您的回复。链接很好。通过使用Withmann并使用mt_rand()将其植入,我已经解决了我的问题。它现在正在以统一的概率选择数字。
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)