早些时候,我在 Matlab 中为这种彩票功能编写了一个代码,只是为了测试它是否可能。但是,我实际上在 PHP 中需要它,所以我刚刚重写了代码,它似乎确实有效,但由于它涉及大量循环,我想确保我尽可能高效地完成它。
代码的作用:
您可以调用该函数$lotto -> type($users,$difficulty)
,它将返回两个数字。这是解释,$users
是在网站上注册的用户数量,即可能会买票的人。$difficulty
是一个介于 1 和 10 之间的数字,其中 5 表示正常,1 表示容易,10 表示困难。这里的难度意味着匹配彩票上的所有数字有多难。
那么函数返回的数字是多少?那将是$n
和$r
。$n
是彩票上的$r
号码数量,是您可以从彩票中选择的号码数量。例如,在英国,一张国家彩票有 49 个号码,如果您选择 6。即$n = 49
和$r = 6
。
该函数如何计算这两个数字?在英国国家彩票中,有 13,983,816 种可能的彩票组合。如果我要运行$lotto -> type(13983816,1)
它会返回array(49,6)
。基本上,它试图做到这一点,所以有注册用户的数量就有尽可能多的票组合。
tl;博士,这是代码:
<?php
class lotto {
public function type($users,$difficulty){
$current_r = $r = 2;
$current_n = 0;
$difficulty = ($difficulty + 5) / 10; // sliding scale from 1 - 10
$last_tickets_sold = 200; // tickets sold in last lotto
$last_users = 100; // how many users there were in the last lotto
$last_factor = $last_tickets_sold / $last_users; // tickets per user
$factor = $last_factor * $difficulty;
$users *= $factor;
while($r <= 10){
$u = 0;
$n = $r;
while($u < $users && $n < 50){
$u = $this -> nCr(++$n,$r);
}
if($r == 2){
$current_n = $n;
} elseif(abs($this -> nCr($n,$r) - $users) < abs($this -> nCr($current_n,$current_r) - $users)){
// this is a better match so update current n and r
$current_r = $r;
$current_n = $n;
}
$r++;
}
return array($current_n,$current_r);
}
private function nCr($n,$r){
return $this -> factorial($n) / (
$this -> factorial($r) * $this -> factorial($n - $r)
);
}
private function factorial($x){
$f = $x;
while(--$x){
$f *= $x;
}
return $f;
}
}
$lotto = new lotto;
print_r($lotto -> type(1000,5));
?>