使用随机制作虚构的“人”,获取大量克隆(PHP,Mysql)

时间:2014-03-18 20:28:12

标签: php mysql random

所以,我试图制作一个角斗士游戏,其中玩家将是lanistas。我追求现实主义,因此角斗士将在竞技场中死去,大量涌入新的"新兵"必要的。

目前,每个新创造的角斗士都有21个属性,从力量和敏捷性等数值到派系和名称的文本。这些是通过随机函数计算的。名字和派系我从数组中选择randomely(至少对于名字而言)是一个相对较大的现实名称列表。数值只是rand(x,y)。

在我添加名称和阵列数组之前,我尝试了多次运行创建角斗士的文件,并使用while循环创建了10000个角斗士,没有任何克隆出现,据我所见。现在,从随机选择名称(如上所述),如果我创建少量角斗士,一切正常,但是一旦我使用了几百个数字用于我的while循环,或者我运行了一些文件在我的while循环中,连续几次的数字与50一样低,我得到了克隆。

对于大多数属性,有21个属性,100个不同的值+,克隆不是偶然发生的。谁能告诉我什么错了?这可能会扼杀我的游戏,在克服了一些(简单的)挑战之后,我只是变得乐观了。

哦,是的,具有属性的角斗士会自动进入mysql数据库。

修改(更新): 我回到我的东西,删除命名和派系随机函数,并将所有设置为" s"。从派系中创建了名为s s的10000名角斗士,似乎有正确的0个克隆 - 没有人具有完全相同的统计数据。

重新激活随机名称功能。跑完文件,创造了200个角斗士。无法看到克隆。再来吧。每个角斗士一个克隆。然后再次。现在有两个克隆人为角斗士。

这个随机函数根本不是随机函数,是吗?

修改(更新2): 再次测试它,其中一个先前被排除的随机函数一次激活一个。似乎它的名字和姓氏功能正在搞砸了。此外,从我上次的测试来看,似乎有一个模式,角斗士id 209等于737,77等于605和1133,148等于676,772等于244,依此类推。

737-209,605-77,1135-605,676-148,772-244在comon中都有一件事。他们都等于528。

这根本不是随机的。

我用来获取名字的功能类似于:

$surname=surname($faction) //surname is a function, using the variable $faction

function surname($faction) {
if ($faction=="Roman") {
$nomen = array("Aburius", "Accius", [...]);
$cognomen = array("Zeno", "Zonsimus", [...]);
$randnomen=array_rand($nomen,1);
$randcognomen=array_rand($cognomen,1);
$merge=array($nomen[$randnomen],$cognomen[$randcognomen]);
$surname=implode(" ",$merge);
return $surname;
}

澄清:为了节省空间和时间,$ nomen和$ cognomen数组中的[...]代替了数百个罗马名称。

1 个答案:

答案 0 :(得分:0)

array_rand似乎存在随机性问题,请参阅here

我更喜欢自己使用mt_rand

以下函数可以使用1,2或3个部分创建随机名称。

function randomName(){
    $numargs = func_num_args();
    $first = func_get_arg(0);
    $one = count($first)-1;
    $name = $first[mt_rand( 0,$one)]; //count($array)-1 
    if($numargs > 1){
        $middle = func_get_arg(1);
        $two = count($middle)-1;
        $name .=" ". $middle[mt_rand( 0,$two)];
    }   
    if($numargs > 2){
        $last = func_get_arg(2);
        $three = count($last)-1;
        $name .= " ".$last[mt_rand( 0,$three)];
    }
    return $name;
}

使用

$var= randomName($first,$middle,$last);// 3 names
$var= randomName($first,$last);// 2 names
etc

WHERE $ first,$ middle,$ last是数组