tags:

views:

77

answers:

5

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"&gt;

<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>
+4  A: 

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.
}
timdev
You forgot to post your code!
Byron Whitlock
When writing incremental answers you should at least try making the intermediate revisions helpful.
Joey
Yeah, fat-fingered. Always end up hitting tab in the answer box, somehow followed it with a space or enter.
timdev
+6  A: 

You could do something like this

if (rand(0,1))
{
 $roll = rand(2,6);
}
else
{
 $roll = 1;
}
Byron Whitlock
+1 for same answer as me, and being able to type without accidentally submitting forms.
timdev
A: 

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;
Chinmay Kanchi
Your code only gives 1 a third of the time, and it can also give 7.
Grandpa
Serves me right for posting answers when I'm tired...
Chinmay Kanchi
A: 

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>';
Brian Fisher
A: 

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

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