如何自然地抓住彩票球

时间:2016-02-15 08:28:30

标签: php

<?php

class Lottery
{
    private $start;
    private $end;

    public function __construct($start = 1, $end = 49)
    {
        $this->start = $start;
        $this->end = $end;
    }

    public function balls($num = 5)
    {
        $balls = range($this->start, $this->end);
        shuffle($balls);
        $index = array_rand($balls, $num);
        $result = [];

        for ($i = 0; $i < $num; ++$i) {
            $result[] = $balls[$index[$i]];
        }

        $result = implode(', ', $result);

        return $result;
    }
}

这就是我获得彩票的方式,我的朋友告诉我越来越多的游戏,如果你通过内置函数随机选择会有一些规则,是真的吗?以及如何防止这种情况。

更新了代码

<?php

class Lottery
{
    private $start;
    private $end;
    public $tempBalls = [];

    public function __construct($start = 1, $end = 49)
    {
        $this->start = $start;
        $this->end = $end;
    }

    public function balls($num = 5)
    {
        $balls = range($this->start, $this->end);
        $results = [];

        do {
            $results[] = $this->randBall($balls);
        } while (count($results) < $num);

        $result = implode(', ', $results);
        $this->tempBalls = [];

        return $result;
    }

    private function randBall($range)
    {
        $ball = $range[mt_rand(0, count($range) - 1)];

        if (!in_array($ball, $this->tempBalls)) {
            $this->tempBalls[] = $ball;
        } else {
            return $this->randBall($range);
        }

        return $ball;
    }
}

1 个答案:

答案 0 :(得分:0)

我没有使用shuffle()进行测试,但除非您先rand(),否则set a seed value函数肯定会返回相同的数字序列。检查这是否适用于shuffle()应该是微不足道的。

如果您阅读文档,则会看到rand()返回伪随机编号,并包含有关不使用它进行加密的警告。如果你考虑一个更简单的情况,rand总是从集合{0,1,2,3,4,5}返回一个数字然后回绕,只是从随机偏移开始然后显然这会破坏加密点,实际上改变数字的顺序在初始集中并没有真正影响这么多。

但这实际上有多少适用于彩票球?首先,没有任何加密知识的人会使用如此小的范围来生成这样一个范围内的随机数。其次,您并不是要保护数据的保密性。

您用于选择要加票的号码的随机数不会影响结果。

您选择加密的随机数确实会影响结果。

可能还有其他关于公平的考虑因素。如果您选择价值作为彩票客户,或者您正在挑选中奖号码,那么您不会说。后者意味着您必须能够证明代码中没有内在缺陷。我已经说过rand()返回一组可预测的数字,但是当播种requires a very large set of numbers to be known时它的输出(在rand()的情况下,模式在2 ^ 31之后重复),或者种子值是已知为了预测值。

无论如何,请使用mt_rand()或openssl_random_pseudo_bytes(),但它不会对您的项目产生任何功能差异。