PHP控制兰特的输出

时间:2009-10-12 23:16:36

标签: php

是否可以控制rand的输出,例如,如果我只想让rand给我变量$ roll1的输出,其值为或者在rand运行时的六种可能性中的一半时间的数量或者刷新浏览器时,如何实现?

我的代码很糟糕,但我正在努力学习,我偶尔会得到一个,但它不一致,我每次刷新页面时都想要1。

所以,如果我刷新页面6次,我应该从变量$ roll1中获得1次三次,而$ roll1的其余值应该是随机的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>loaded dice</title>
</head>
<body>
<h1>loaded dice</h1>
<h3>loaded dice</h3>
<?php
// loaded dice, should roll the number 1 half the time out of a total of 6.
// So if I refreshed my browser six times I should at least see three 1's for roll1.
$roll1 = rand(1, 6);

// Okay is it possible to divide rand by two or somehow set it up
// so that I get the the value 1 half the time?
// I am trying division here on the if clause in the hopes that I can just have
// 1 half the time, but it's not working,maybe some type of switch might work? :-(.

if ($roll1 == 3) {
    $roll1 / 3;
}
if ($roll1 == 6) {
    $roll1 / 6;
}
if ($roll1 == 1) {
    $roll1 / 1;
}

// This parts works fine :-).
// Normal random roll, is okay.
$roll2 = rand(1, 6);

print <<<HERE
<p>Rolls normal roll:</p>
You rolled a $roll2.
<p>Rolls the number 1 half the time:</p>
<p>You rolled a $roll1.</p>
HERE;

// Notice how we used $roll1 and 2, alongside the HERE doc to echo out a given value.
?>
<p>
    Please refresh this page in the browser to roll another die.
</p>
</body>
</html>

5 个答案:

答案 0 :(得分:6)

你可以做这样的事情

if (rand(0,1))
{
    $roll = rand(2,6);
}
else
{
    $roll = 1;
}

答案 1 :(得分:4)

你不能直接让rand()这样做,但你可以这样做:

<?PHP
function roll(){
   if(rand(0,1))  //this should evaluate true half the time.
       return 1;
   return rand(2,6); //the other half of the time we want this.
}

答案 2 :(得分:0)

略有不同的解决方案。它不是那么优雅,但也许更有利于更精细地装载模具?

$i = rand(1, 9);
if($i<=3)
{
    $num = 1;
}
else $num = $i-2;

答案 3 :(得分:0)

因此,如果你想保证在最后6卷中它们总是至少有3个,我认为你必须跟踪卷的历史。这是一种方法:

<?php

if (array_key_exists('roll_history', $_GET)) {
    $rollHistory = unserialize($_GET['roll_history']);
} else {
    $rollHistory = array();
}

$oneCount = 0;
foreach($rollHistory as $roll) {
    if ($roll == 1) {
        $oneCount++;
    }
}

if (6 - count($rollHistory) + $oneCount <= 3) {
    $roll = 1;
} else {
    if (rand(0,1)) {
        $roll = rand(2,6);
    } else {
        $roll = 1;
    }
}
$rollHistory[] = $roll;
if (count($rollHistory) > 5) {
    array_shift($rollHistory);
}

echo '<p>Weighted Dice Role: ' . $roll . '</p>';
echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get" >';
echo '<input type="hidden" name="roll_history" value="' . htmlspecialchars(serialize($rollHistory)) . '" />';
echo '<input type="submit" value="Roll Again" name="roll_again" />';
echo '</form>';

答案 4 :(得分:0)

而不是两次调用rand(),你可以简单地做一些额外的数学运算。

$roll = $x = rand(1,12)-6 ? $x : 1;