アルゴリズム

アルゴリズム

ある時刻から指定時間経過したかどうか

(ある時刻) > (現在時刻) - (指定時間)

くじのような当選確率に偏りがある抽選

  • 各当選確率を決める。
  • (抽選値)を1~各当選確率の合計値までの範囲でランダムで決定
  • (判定範囲開始値)初期化
  • 判定ループ開始
  • (当選確率)抽出
  • (判定範囲開始値)と(判定範囲開始値) + (当選確率)の間に(抽選値)があるかどうかの判定
  • あったら該当の当選確率を持つものが当選で終了
  • なかったら(判定範囲開始値)を(判定範囲開始値) + (当選確率)で更新して判定ループ頭へ戻る

わかりにくいのでPHPコードで書くと

$a = array(
    array('name' => 'hoge', 'win' => 10),
    array('name' => 'piyo', 'win' => 50),
    array('name' => 'fuga', 'win' => 40),
);
$b = rand(1, 10 + 50 + 40);
$begin = 1;
foreach($a as $c){
    if($begin <= $b && $b < $begin + $c['win']){
        echo $c['name'] . 'が当選';
    }
    $begin = $begin + $c['win'];
}

2つの範囲(区間, 期間)が重複しているか否か

日付等の連続区間が重複しているかどうかがどうかというのはよくあること 基準範囲をA、開始をs、終了をe、比較対象をBとすると

As <= Be AND Ae >= Bs

このような判定で真となる場合重複しているといえる。

  • 対象Aの始まりが対象Bの終わりよりも前である
  • 対象Aの終わりが対象Bの始まりよりも後である

範囲の関係性を考えると

  • AにBの後半が被っている
  • AがBに完全に包含されている
  • AにBの前半が被っている
  • AにBが完全に包含されている
  • AとBがまったく被ってない

の5パターンになる

↑の関係式で5パターンすべてが満たされてることがわかる

配列をシャッフルする

Fisher–Yates shuffle - Wikipedia, the free encyclopedia

配列をランダムに並び替えるやり方。 JavaScript で実装すると

var a = [1, 2, 3, 4, 5];
var length = a.length;
for(var i = length - 1; i > 0; i--) {
    var swapIndex = Math.floor(Math.random() * (i + 1));
    var tmp = a[i];
    a[i] = a[swapIndex];
    a[swapIndex] = tmp;
}

Math.random() は 0 から 1未満 の範囲で乱数を発生させるので最初は 0 から 5 未満の値が出る。そこで Math.floor しているので、 0 から 4 の値を取り出している。この index の要素を配列の末尾、最初ならindex 4 のと交換する。

そして交換の範囲を狭めながら後ろから確定させていく。

全レコード数からのページ数

定義通り JavaScript のコードで書くとこんな感じ

function getPage(total, limit){
    // ゼロはゼロ
    if(total == 0){
        return 0;
    }
    // あまりなし
    if((total % limit) == 0){
        return (total / limit);
    }
    // あまりの分足す
    return (total / limit) + 1;
}

手抜き

function getPage(total, limit){
    return Math.ceil(total / limit);
}

切り上げの関数を使えばよい。

PHP ならば

function getPage($total, $limit){
    return ceil($total / $limit);
}

タグ

algorithm/start.txt · 最終更新: 2018-09-13 19:28 by ore