开发者

PHP controlling the output of rand

开发者 https://www.devze.com 2022-12-08 03:15 出处:网络
Is it possible tocontrol the output of rand, for example if I just want rand to give me the output of the variable $roll1 with the value or number of 1 half the time out of the six possibilities when

Is it possible to control the output of rand, for example if I just want rand to give me the output of the variable $roll1 with the value or number of 1 half the time out of the six possibilities when rand is ran or when the browser is refreshed, how does one accomplish that?

My code sucks but I am fighting to learn, I only get one every now and then, but it's not consistent, I want a 1 every time I refresh the page.

So If I refresh the page 6 times I should get a 1 out of the variable $roll1 three times, and the rest of the values for $roll1 should be random.

<!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>


You could do something like this

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


You can't directly make rand() do that, but you can do something like this:

<?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.
}


So if you want to guarantee that in the last 6 rolls their would always have been at least 3 ones, I think you would have to track the history of the rolls. Here is a way to do that:

<?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>';


Rather than call rand() twice, you can simply do a little extra math.

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


A slightly different solution. It isn't as elegant, but perhaps more conducive to loading the die more finely?

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

精彩评论

暂无评论...
验证码 换一张
取 消