我目前正在开展一个我生成随机PIN的项目。最初,每个PIN以4位长度开始,即2345,5456等等。但是,我试图这样做,如果使用所有4位数的引脚,那么它会增加到5位数,然后是6位数。基本上你不会用完它!
我使用laravel并创建了一个特性:
<?php
namespace App\Traits;
use App\Models\Quiz;
trait QuizPinTrait
{
private $pin = null;
private $min, $max;
private function setup()
{
$this->min = 1111;
$this->max = 9999;
$this->pin = mt_rand($this->min, $this->max);
}
public function generate()
{
$this->setup();
if ($this->checkNotInUse()) {
return $this->pin;
}
return false;
}
private function checkNotInUse()
{
$inUse = Quiz::where('pin', $this->pin)->count();
if (!$inUse || $inUse == 0) {
return true;
} else {
// stuck here...
}
}
}
我首先考虑过将1加到最小值,将9加到最大值,但是,我不确定如何为此做出有效的解决方案。
答案 0 :(得分:4)
您可以针对正在使用的PIN数组创建一个整数数组[1111,...,9999]
和diff,以获取可用的PIN。
$isUse = Quiz:all()->pluck('pin');
$min = 1111;
$max = 9999;
$allPins = range($min,$max);
$notInUse = array_diff($allPins, $inUse);
// laravel one liner
$notInUse = collect(Quiz:all()->pluck('pin'))->diff(range($min,$max));
然后,当前范围没有更多可用时:
$min = $max+1;
$max *= 10;
答案 1 :(得分:1)
这是一个需要更少内存的版本。
选择0到9999之间的随机数。这是你的关键。然后你可以这样做:
function getPin() {
static $lastPin = 0;
$key = 4864;
$lastPin++;
return $lastPin ^ $key;
}
// Example: displaying lots of pins
$i=0;
while($i++<10002) {
echo getPin(), "\n";
}
这样做的缺点是它不是随机的。