2009-10-12 4 views
1

Можно ли управлять выходом rand, например, если я просто хочу, чтобы rand дал мне выход переменной $ roll1 со значением или числом в 1 половину времени из шести когда запускается rand или когда браузер обновляется, как это выполнить?PHP, управляющий выходом rand

Мой код сосет, но я борюсь за то, чтобы учиться, я получаю его каждый раз, но это не согласуется, я хочу 1 каждый раз, когда обновляю страницу.

Так что если я обновляю страницу 6 раз, я должен получить 1 из переменной $ roll1 три раза, а остальные значения для $ 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> 

ответ

6

Вы могли бы сделать что-то вроде этого

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

+1 за тот же ответ, что и у меня, и возможность ввода без случайного представления форм. – timdev

4

Вы не можете сразу сделать рандов() сделать это, но вы можете сделать что-то вроде этого:

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

Вы забыли оставить свой код! –

+1

При написании дополнительных ответов вы должны хотя бы попробовать сделать промежуточные ревизии полезными. – Joey

+0

Да, с пальцами. Всегда вставляйте вкладку в поле ответа, каким-то образом следует за ней или пробелом. – timdev

0

несколько иной решение. Это не так изящно, но, возможно, более удобно для погрузки штампа более мелко?

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

Ваш код дает только 1 треть времени, и он также может дать 7. – Grandpa

+0

Служит мне для публикации ответов, когда я устал ... –

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

Вместо того, чтобы дважды вызвать rand(), вы можете просто сделать небольшую дополнительную математику.

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