从数组中随机选择一个名称(数组开头的值更有可能)


Randomly choose a name from an array (values at beginning of array more likely)

所以我有一份爱尔兰前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];
        }
    }
}
?>

杰克、詹姆斯、丹尼尔、肖恩等应该输出很多。。。

但这里有一些随机输出:

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

我没有看到杰克/詹姆斯等。?

我试图让采样器最频繁地输出数组开头的名称,而最不频繁地输出阵列末尾的名称。

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

$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);

尝试一个完全不同的逻辑

$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];
}