我最近有一项任务要完成,但我失败了。我通常不会要求逻辑,但今天我很沮丧地问。这是任务。
我不允许使用php的rand()函数。相反,我可以使用这个功能。
function getRandom()
{
return rand(1,5);
}
好的我尝试了这个功能,但它必须从3到7返回值。
function getMoreRandom()
{
$value = getRandom();
return $value + 2;
}
现在我必须定义一个php函数,它可以返回范围为1到7的随机数。我该怎么办?
答案 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的倍数。