以前、この種の宝くじ関数のコードを Matlab で書き、それが可能かどうかをテストしました。ただし、実際にはPHPで必要だったので、コードを書き直したところ、機能しているように見えますが、多くのループが含まれているため、できるだけ効率的に実行していることを確認したいと考えています.
コードの機能:
関数$lotto -> type($users,$difficulty)
を呼び出すと、2 つの数値が返されます。説明$users
は次のとおりです。これは、ウェブサイトに登録されているユーザーの数です。つまり、チケットを購入する可能性のある人々です。$difficulty
は 1 から 10 までの数字で、5 は通常、1 は簡単、10 は難しいです。ここでの難易度とは、宝くじのすべての数字を一致させることがどれだけ難しいかを意味します。
では、関数が返す数値は何でしょうか? それは$n
と$r
です。$n
は宝くじに記載される数字の数で、$r
は宝くじから選択できる数字の数です。たとえば、英国では、全国の宝くじのチケットに 49 の数字があり、そのうちの 6 つを選択する$n = 49
とします$r = 6
。
関数はこれら 2 つの数値をどのように計算しますか? 英国の国営宝くじでは、13,983,816 通りの異なるチケットの組み合わせが考えられます。実行する$lotto -> type(13983816,1)
と、 が返されarray(49,6)
ます。基本的には、チケットの組み合わせが登録者数だけあるようにしています。
tl;dr、コードは次のとおりです。
<?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));
?>