【问题标题】:Randomly choose a name from an array (values at beginning of array more likely) [duplicate]从数组中随机选择一个名称(数组开头的值更有可能)[重复]
【发布时间】:2014-10-30 21:40:51
【问题描述】:

所以我有一份爱尔兰前 100 名男孩名字的列表:

这是我的 PHP:

<?php
$top100irishNames = <<<END
Jack
James
Daniel
Sean
Conor
Adam
Harry
Ryan
Dylan
Michael
Luke
Charlie
Liam
Oisin
Cian
Jamie
Thomas
Alex
Noah
Darragh
Patrick
Aaron
Cillian
Matthew
John
Nathan
David
Fionn
Evan
Ethan
Jake
Kyle
Rian
Ben
Max
Eoin
Tadhg
Finn
Callum
Samuel
Joshua
Rory
Jayden
Joseph
Tyler
Sam
Shane
Mark
Robert
Aidan
William
Ronan
Eoghan
Alexander
Leon
Cathal
Mason
Tom
Oliver
Andrew
Oscar
Ciaran
Bobby
Jacob
Senan
Rhys
Scott
Benjamin
Cormac
Kevin
Lucas
Alan
Donnacha
Jakub
Christopher
Filip
Killian
Josh
Alfie
Tommy
Ruairi
Odhran
Oran
Leo
Isaac
Dara
Jason
Zach
Martin
Peter
Brian
Danny
Niall
Tomas
Edward
Stephen
Logan
Kacper
Anthony
Billy
END;

$top100irishNames_arr=preg_split("/\n/",$top100irishNames);
for($i=0;$i<25;$i++){
    echo getRandomWeightedElement($top100irishNames_arr)."\n";
}


function getRandomWeightedElement($arr) {
    $rand = mt_rand(1, (int) sizeof($arr));

    for ($i=0;$i<sizeof($arr);$i++) {
        $rand -= $i;
        if ($rand <= 0) {
            return $arr[$i];
        }
    }
}

?>

Jack、James、Daniel、Sean等应该输出很多...

但这里有一些随机输出:

Ryan
Cian
Luke
Charlie
Harry
Luke
Harry
Charlie
Oisin
Ryan
Luke
Luke
Michael
Liam
Liam
Adam
Ryan
Oisin
Conor
Oisin
Liam
Oisin
Daniel
Adam
Oisin

我没有看到任何 Jack/James/等?

我试图让采样器最常输出数组开头的名称,而最不常输出数组末尾的名称。

【问题讨论】:

  • 如果你输出$rand(在它每次修改之前)并停止猜测怎么办?

标签: php arrays random sample


【解决方案1】:

这是您可以增加权重以获得更多数组值开始的另一种方法

$cnt =0;
$max=25;
$weight= 2; //change this value to 3,4 and try

function doPrint($arr){
    global $top100irishNames_arr, $cnt,$weight,$max;
    if(sizeof($arr) == 0){
        $arr = $top100irishNames_arr;
    }
    if($cnt<$max){
        $cnt++;
    }else{
    return;
    }
    $rand = rand(0, sizeof($arr)-1);
    echo $arr[$rand-1];

    $temp = array_slice($arr,0,(int)(sizeof($arr)/$weight));
    doPrint($temp);

}

doPrint($top100irishNames_arr);

【讨论】:

  • 非常好。你们真是难以置信。非常感谢!
【解决方案2】:

试试这个完全不同的逻辑

$temp=array();
for($i=0;$i<count($top100irishNames_arr);$i++){
  for($j=0; $j<$i; $j++){
    $temp[]=  $top100irishNames_arr[$j];
  }
}

for($i=0;$i<25;$i++){
  $rand = rand(0, sizeof($temp)-1);
  echo $temp[$rand-1];
}

【讨论】:

  • 不错。我可以更强烈地加权它以支持数组开头的名称吗? “杰克”在 25 个样本中只出现一两次......
猜你喜欢
  • 2021-05-06
  • 2012-02-21
  • 2013-07-17
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
相关资源
最近更新 更多