排除先前随机化的整数,并在没有它的情况下再次随机化

时间:2010-02-06 23:28:31

标签: php

<?php
        if (isset($_POST['Roll!'])) {
                    $sides = $_POST['sides'];
                    $rolled = rand(1,$sides);

                    echo "$rolled was rolled by the dice, it is now out!";
        }
?>

这是我目前的代码。然而,在滚动该数字之后,我希望它再次滚动,但是没有先前滚动的数字,直到它滚动除了一个之外的所有数字,这将是获胜的数字。我不知道该怎么做。有什么想法吗?

编辑:对不起,我应该更清楚,谢谢大家帮助到目前为止,但我还需要回应每个编号,例如

echo "$rolledArray[0] was rolled, it lost.\n";
echo "$rolledArray[1] was rolled, it lost.\n";
echo "$rolledArray[2] was rolled, it lost.\n";
echo "$rolledArray[3] was rolled, it lost.\n";
echo "$rolledArray[x] was rolled, it lost.\n";
echo "$rolledArray[x] was rolled, it lost.\n";
echo "$rolledArray[50?] was rolled, it lost.";

再次编辑:我也只想让他们点击滚动!一次,不是多次,直到他们滚动所有数字,这意味着没有必要进行会话,我想,虽然我可能错了,但大多数人显然比我更有经验。

对不起,我之前也应该提到过。

7 个答案:

答案 0 :(得分:5)

回答你的直接问题: 您可以将所有可能的数字放入数组中,并获取该数组的随机索引。获得索引后,从数组中删除该项,然后在较小的数组上重做随机:

$possible = range(1, $_POST['sides']);     // build the possible values
$rolledIndex = rand (0, count($possible)); // get a random index
$rolled = $possible[$rolledIndex];         // get the rolled number

unset($possible[$rolledIndex]);            // and remove the rolled nuber

// now you can simply redo the random:
$rolledIndex = rand (0, count($possible)); // get a random index on the smaller array
$rolled = $possible[$rolledIndex];         // get the 2nd rolled number

然而,如果你想在掷骰子上有一个随机顺序,只需使用它:

// generate an array with all values from 1 to the posted value (e.g. 1,2,3,4,5,6)
$possible = range(1, $_POST['sides']);  

// this reorders the array by random (e.g. 4,3,1,5,2,6)
$throwOrder = $possible;
shuffle($throwOrder); 
print_r($throwOrder);

现在你可以简单地遍历$throwOrder数组,并随机输出一个骰子:

Array (
    0 => 4,
    1 => 3,
    2 => 1,
    3 => 5,
    4 => 2,
    5 => 6
)

编辑要从第二种方法获得所需的输出,只需执行以下操作:

// get the last index of the array of thrown dices
$lastIndex = count($throwOrder)-1;
// iterate through the array, printing the results
foreach ($throwOrder as $key => $rolled) {
    // check if the current key matches the last key in the array
    if ($key != $lastIndex) {
        // if not, the number has lost
        echo $rolled, " was rolled, it lost.\n";
    } else {
        // we have reached the last element of the array
        echo $rolled, " was the last, it won.\n";
    }
}

答案 1 :(得分:2)

我认为你需要拥有数组$thrownNumbers,它保存以前抛出的每个数字。每一个新的投掷(OMG ......这个词),你检查它是否在阵列中。如果是,请再次投掷。最简单的解决方案。

编辑:至于在移动到另一个页面期间保持阵列,您可以使用:

  • $ _ SESSION
  • cookies(hm)
  • 将数组序列化为隐藏值

答案 2 :(得分:1)

您可以将它放在$ _SESSION中,以便在帖子/请求之间跟踪它,或者将其附加到URL并每次将其作为URI参数自行传递。

答案 3 :(得分:1)

<?php
if(!isset($_SESSION['numbers']){
 $_SESSION['numbers'] = range(1,6); //same as array(1,2,3,4,5,6)
}
$numbers = $_SESSION['numbers'];

if(count($numbers)>1){ //is more than one number left
 $rand_index = array_rand($numbers); //choose a number from an array, returns the index
 print('you rolled '.$numbers[$rand_index].' loser'); // tell them they lost
 unset($numbers[$rand_index]); //remove that element from the array
 $_SESSION['numbers'] = $numbers; //set new array back to session
}else{
 print(array_pop($numbers).' is the winner!'); //pop the remaining number out of the array and print it with winner notification
}
?>

编辑:更新为会话使用

答案 4 :(得分:1)

只需创建一个包含所有可能数字的数组(或其他类型的列表)并随机排序。然后,每次只是通过数组前进而不是选择一个新数字,直到你到达最后一个而不是一个。

或者,您可以直接转到列表中的最后一个号码,这就是赢家。

答案 5 :(得分:1)

如果使用正确,添加到URL并不是一个坏主意。好的一面是你不在会话中存储数据,不好的一面是每次请求都更大。为避免篡改,您可以使用:

$url = 'numbers.php?throwed='.implode(',',$throwed).'&sign='.sha1(serialize($throwed).'mysecretpassword');

用这个来检查:

$throwed = explode(',',$_GET['throwed']);
$not_tampered = sha1(serialize($throwed).'mysecretpassword') == $_GET['sign'];

答案 6 :(得分:0)

这取决于具体情况,但是为您网络中的所有访问者创建一个包含所有可能数字的数组可能是一个非常糟糕的主意,会话文件可能会不必要地增长。 如果它们是1到10之间的数字,我认为它会没问题,但是如果它们是1到1百万的数字,那么在会话中保存这些范围的数组就是一个坏主意。 我认为最好保存滚动结果并生成一个新结果,直到数组中不存在。