带条件的PHP随机数生成

时间:2013-01-25 13:13:16

标签: php random numbers

我最近有一项任务要完成,但我失败了。我通常不会要求逻辑,但今天我很沮丧地问。这是任务。

我不允许使用php的rand()函数。相反,我可以使用这个功能。

function getRandom()
{
     return rand(1,5);
}

好的我尝试了这个功能,但它必须从3到7返回值。

function getMoreRandom()
{
    $value = getRandom();
    return $value + 2;

}

现在我必须定义一个php函数,它可以返回范围为1到7的随机数。我该怎么办?

6 个答案:

答案 0 :(得分:5)

function getMoreRandom()
{
    do {
        $temp = 5 * (getRandom() - 1) + getRandom();
    } while ($temp > 21);

    return $temp % 7 + 1;
}

答案 1 :(得分:4)

flov的回答是正确的:

function getMoreRandom()
{
    do {
        $temp = 5 * (getRandom() - 1) + getRandom();
    } while ($temp > 21);

    return $temp % 7 + 1;
}

用以下方法测试:

$aryResults = array_pad(array(),8,0);
foreach(range(0,100000) as $i) $aryResults[getMoreRandom()]++;
$intSum = array_sum($aryResults);
foreach($aryResults as $intValue => $intCount) printf("Value %d Count %d (%.2f)\n",$intValue,$intCount,$intCount/$intSum);

生成矩形分布

Value 0 Count 0 (0,00)
Value 1 Count 14328 (0,14)
Value 2 Count 14316 (0,14)
Value 3 Count 14185 (0,14)
Value 4 Count 14197 (0,14)
Value 5 Count 14322 (0,14)
Value 6 Count 14361 (0,14)
Value 7 Count 14292 (0,14)

抱歉,我没有对答案发表评论。显然我不能因为我缺乏声誉(我是新来的)。

答案 2 :(得分:2)

它不会是统一的分布(并且你没有指明它需要)。

对于最简单的解决方案,你不需要做缩放或循环,你可以随机1到5,然后随机添加0到2;

function getMoreRandom()
{
    return getRandom() + getRandom() % 3;
}

快速测试以了解分布情况:

$results = array_fill(1, 7, 0);

for ($i = 0; $i < 1000000; $i++) {
    $results[rand(1,5) + rand(1,5) % 3]++;
}

var_dump($results);

如上所述,并非设计为均匀随机。

array(7) {
  [1]=>
  int(39550) // 4%
  [2]=>
  int(120277) // 12%
  [3]=>
  int(200098) // 20%
  [4]=>
  int(199700) // 20%
  [5]=>
  int(200195) // 20% 
  [6]=>
  int(160200) // 16%
  [7]=>
  int(79980) // 8%
}

稍微复杂一点,和@flovs不同的方法(我不喜欢他的循环 永远持续的方式 - 嘿,这是随机的)

function getMoreRandom()
{
    for (
        $i = 0, $v = 0;
        $i < 7;
        $i++, $v += getRandom()
    );

    return $v % 7 + 1;
}

这会产生均匀分布

array(7) {
  [1]=>
  int(14397)
  [2]=>
  int(14218)
  [3]=>
  int(14425)
  [4]=>
  int(14116)
  [5]=>
  int(14387)
  [6]=>
  int(14256)
  [7]=>
  int(14201)
}

答案 3 :(得分:1)

我的解决方案:

<?php

function getRandom()
{
     return rand(1,5);
}

$random_number = getRandom();
$random_number += time();

$random_number = ($random_number % 7) + 1;

答案 4 :(得分:0)

只是为了提出一个好问题,我认为这可能更通用。这意味着我们可能不希望1-7基于兰特(1,5)但3-7或1-10等等。

该函数适用于数字1-25,因为我正在使用另一个带有2d数组的解决方案。

function getMoreRand($start, $end){
        $restart = $start; //Save $start value, to restart if we reach the $end number 
        $parser = 0; //Count number elements in 2d array
        $result = 0; //Return the result based on rand(1,5)

        //Create a 2d array(), 5x5 to simulate the 1-5 random number selection from rand(1,5)
        for($row = 0; $row < 5; $row++){
            for($col = 0; $col < 5; $col++){
                $vars[$row][$col] = $start;

                //If the array elements left <= selected range left
                if((25-$parser) <= ($end-$start)){
                    $vars[$row][$col] = 0;
                }else{
                    if($start == $end){
                        $start = $restart;
                    }else{
                        $start++;
                    }
                }       
                $parser++;

            }//END OF FOR COL LOOP
        }//END OF FOR ROW LOOP


        while($result == 0){
            $i = getRandom(); //Choose 1-5
            $j = getRandom(); //Choose 1-5
            $result = $vars[$i-1][$j-1]; //Get number from 2d array, based on rand(1,5)
        }

        echo $result;
    }

答案 5 :(得分:-2)

function getMoreRandom()
{
    $value = 0;
    for($i=1;$i<=5;$i++) $value += getRandom();
    return ($value % 7) + 1;
}
  • 首先,拨打getRandom 5次,获得5到25的范围。这正好是21个值 - 7的倍数。
  • 然后,找出模数7.这会产生一个介于0和6之间的numnber,每个都有3个21或1个7的概率出现。
  • 然后,为正确的范围添加一个。